为什么List <object> list = new ArrayList <string>()这会给TypeMismatch错误</string> </object>

时间:2013-02-18 11:37:55

标签: java collections arraylist java-6

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

当我使用上面的行编译器时给出了类型不匹配错误。但正如我所理解的,Object是String的超类,如果我创建了对象列表,那么它也应该接受String。那么为什么上述陈述是错误的。我正在寻找解释。

5 个答案:

答案 0 :(得分:6)

一句话,因为

  

通用类型不是多态的

即即使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?

答案 1 :(得分:1)

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

正确的方法是

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

相同

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

答案 2 :(得分:1)

AB的超级类型并不意味着List<A>List<B>的超级类型。如果这样的命题成立,将违反类型系统的一致性。考虑以下情况:

// ! 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<Object>不应该是List<String>的超级类型。

答案 3 :(得分:0)

只需替换:

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

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

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

此处使用相同的数据类型

非常重要

或者您也可以使用

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

答案 4 :(得分:0)

变量声明的类型必须与传递给实际对象类型的类型相匹配。如果你宣布 List<Foo> foo然后你赋予foo参考必须的任何内容 通用类型。不是<Foo>的子类型。不是supertype的{​​{1}}。

<Foo>

Simple Generic types are not polymorphic