我一直在玩泛型和方差。我有两个列表,一个没有泛型,并且具有如下定义的泛型:
List l1 = new ArrayList<Integer>();
List<Object> l2 = new ArrayList<Integer>();
首先编译器工作正常。但是对于第二个,它会引发以下错误:
Error:(12, 31) java: incompatible types: java.util.ArrayList<java.lang.Integer> cannot be converted to java.util.List<java.lang.Object>
现在,据我了解,没有泛型的List
是List<Object>
,因为它允许所有类型的对象。如果两者相同,为什么编译器必须引发错误?
任何人都可以详细说明区别吗?
编辑 好的,从链接的副本中,我可以了解原始类型。但是
来自
原始类型List和 参数化类型列表?宽松地说,前者有 选择了泛型类型检查,而后者则明确告知 能够容纳任何类型的对象的编译器。当你 可以将List传递给List类型的参数,而不能传递 到类型为List的参数。有子类型化规则 泛型,并且List是原始类型List的子类型,但不是 参数化类型List的名称。结果,你输了 如果您使用原始类型(例如List),则输入类型安全,但如果使用 参数化类型,如列表。
此部分:
结果,如果您使用原始类型(例如List),则会失去类型安全性, 但是如果您使用参数化类型(例如List),则不会。
上面不明白。如果所有类型都扩展List<Object>
,则List
的类型安全性比java.lang.Object
更安全吗?只是因为有子输入规则?