为什么在以下代码中允许使用列表,但列表<object>不在列表中?

时间:2019-05-16 06:22:26

标签: java collections types covariance contravariance

我一直在玩泛型和方差。我有两个列表,一个没有泛型,并且具有如下定义的泛型:

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>

现在,据我了解,没有泛型的ListList<Object>,因为它允许所有类型的对象。如果两者相同,为什么编译器必须引发错误?

任何人都可以详细说明区别吗?

编辑 好的,从链接的副本中,我可以了解原始类型。但是

来自

  

原始类型List和   参数化类型列表?宽松地说,前者有   选择了泛型类型检查,而后者则明确告知   能够容纳任何类型的对象的编译器。当你   可以将List传递给List类型的参数,而不能传递   到类型为List的参数。有子类型化规则   泛型,并且List是原始类型List的子类型,但不是   参数化类型List的名称。结果,你输了   如果您使用原始类型(例如List),则输入类型安全,但如果使用   参数化类型,如列表。

此部分:

  

结果,如果您使用原始类型(例如List),则会失去类型安全性,   但是如果您使用参数化类型(例如List),则不会。

上面不明白。如果所有类型都扩展List<Object>,则List的类型安全性比java.lang.Object更安全吗?只是因为有子输入规则?

0 个答案:

没有答案