【问题标题】:Why List<Object> list = new ArrayList<String>() this give TypeMismatch error为什么 List<Object> list = new ArrayList<String>() 这会给出 TypeMismatch 错误
【发布时间】:2013-02-18 11:37:55
【问题描述】:
List<Object> list = new ArrayList<String>()

当我使用上面的行编译器给我类型不匹配错误。但据我了解,对象是字符串的超类,如果我创建对象列表,那么它也应该接受字符串。那么为什么上面的说法是错误的。我正在寻找解释。

【问题讨论】:

标签: java collections arraylist java-6


【解决方案1】:

一句话,因为

泛型类型不是多态的

即,即使java.lang.Stringjava.lang.Object 的子类型,多态性也不适用于泛型类型。它仅适用于集合类型。因此

List<Object> list = new ArrayList<String>(); //this isn't valid
    List<Object> list = new ArrayList<Object>(); //valid
List<? extends Object> list = new ArrayList<String>();//valid

Why can't generic types be polymorphic?

【讨论】:

    【解决方案2】:

    因为您定义了可以关联的可能列表。

    正确的方法是

    List&lt;?&gt; list = new ArrayList&lt;String&gt;();

    相同

    List&lt;? extends Object&gt; list = new ArrayList&lt;String&gt;();

    【讨论】:

      【解决方案3】:

      AB 的超类型并不意味着 List&lt;A&gt;List&lt;B&gt; 的超类型。如果这样的命题成立,就会违反类型系统的一致性。考虑以下情况:

      // ! This code cannot pass compilation.
      List<String> list1 = new ArrayList<String>();
      List<Object> list2 = list1;  // Error
      // Previous conversion causes type contradiction in following statements.
      list2.add(new SomeOtherClass());
      String v = list1.get(0);  // list1.get(0) is not String!
      

      这就是为什么List&lt;Object&gt; 不应该是List&lt;String&gt; 的超类型。

      【讨论】:

        【解决方案4】:

        只需替换:

        List<Object> list = new ArrayList<String>()
        

        List<String> list = new ArrayList<String>()
        

        List<Object> list = new ArrayList<Object>()
        

        这里重要的是您使用相同的数据类型进行操作

        或者你也可以使用

         List<?> list = new ArrayList<Object>();
        

        【讨论】:

        • &lt;?&gt;声明第二种方式将使所有从泛型中获取类型T的方法都无法使用,只有不涉及T的方法才能被调用。
        • List> list = new ArrayList()有什么用处;这里我们不能元素?
        【解决方案5】:

        变量声明的类型必须与您传递给实际对象类型的类型相匹配。如果你声明 List&lt;Foo&gt; foo 那么你分配给 foo 引用的任何内容必须属于 泛型类型。不是&lt;Foo&gt; 的子类型。不是supertype&lt;Foo&gt;

        Simple Generic types are not polymorphic
        

        List&lt;Parent&gt; myList = new ArrayList&lt;Child&gt;() \\ Invalid

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 2017-05-08
          • 2014-01-09
          • 2018-05-19
          • 1970-01-01
          • 2015-05-29
          • 2013-03-27
          • 2012-04-08
          • 2019-03-15
          相关资源
          最近更新 更多