List<Object> list = new ArrayList<String>()
当我使用上面的行编译器时给出了类型不匹配错误。但正如我所理解的,Object是String的超类,如果我创建了对象列表,那么它也应该接受String。那么为什么上述陈述是错误的。我正在寻找解释。
答案 0 :(得分:6)
一句话,因为
通用类型不是多态的
即即使java.lang.String
是java.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
答案 1 :(得分:1)
因为您定义了可以与之关联的列表。
正确的方法是
List<?> list = new ArrayList<String>();
与
相同 List<? extends Object> list = new ArrayList<String>();
答案 2 :(得分:1)
A
是B
的超级类型并不意味着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