为什么不能指定我扩展为?
以下陈述:
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 extends URLClassLoader>
Class extends URLClassLoader>
是不变的 。
结果是,
Class extends URLClassLoader>
Class extends URLClassLoader>
不是 Class
的子类型
在Java中,变量可以包含相同类型或子类型的实例的引用。
因此,
Class uclc = ucl.getClass();
无效 。
另一方面,
Class extends URLClassLoader> uclc = ucl.getClass();
是有效的 。
为什么不能指定我<? 将Type>扩展为
?
因为实际上 extends Type>
extends 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
包含URLClassLoader
, Class extends URLClassLoader>
Class extends URLClassLoader>
是Class
的超类型。
由于在赋值上下文中不允许缩小引用转换 ,因此会发生编译错误。
另请注意,这意味着允许反向分配:
Class concrete = URLClassLoader.class; Class extends URLClassLoader> wildcard = concrete;