为什么不能指定我扩展为?

以下陈述:

URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class uclc = ucl.getClass(); 

失败并出错:

 Type mismatch: cannot convert from Class to Class 

我为什么需要演员?

我发现了几个post,解释了为什么你不能反过来(将T分配给a),但那是(有点)明显和理解。

注意:我在eclipse Luna下编码,所以我不知道它是否是Luna Quirk,或者是否有一些我在仿制药中真的不了解的东西。

协方差与逆变与不变性

  • Class Class不变的

结果是,

Class Class 不是 Class 的子类型


在Java中,变量可以包含相同类型或子类型的实例的引用。

因此,

 Class uclc = ucl.getClass(); 

无效

另一方面,

 Class uclc = ucl.getClass(); 

有效的

为什么不能指定我<? 将Type>扩展为

因为实际上 的超 ! 让我们遵循规范。

4.10.2类和接口类型的子类型 :

给定generics类型声明C 1 ,…,F n >,参数化类型C 1 ,…,T n >的直接超类型全部如下:

  • C 1 ,…,S n >,其中S i包含T i

4.5.1。 参数化类型的类型参数 :

类型参数T 1被称为包含另一个类型参数T 2 ,写为T 2 <= T 1 ,如果由T 2表示的类型集合可certificate是在反身和传递下由T 1表示的类型集的子集关闭以下规则:

  • T <=? 延伸T.

因此我们知道? extends URLClassLoader ? extends URLClassLoader包含URLClassLoaderClass ClassClass的超类型。

由于在赋值上下文中不允许缩小引用转换 ,因此会发生编译错误。

另请注意,这意味着允许反向分配:

 Class concrete = URLClassLoader.class; Class wildcard = concrete;