以下声明:

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

失败并出错:
Type mismatch: cannot convert from Class<capture#2-of ? extends URLClassLoader> to Class<URLClassLoader>

为什么我需要一个演员?
我发现有几篇文章解释了为什么你不能做相反的事情(把t赋给a),但这很明显,也很容易理解。
注意:我是在EclipseLuna下编写的,所以我不知道这是Luna的怪癖还是泛型中有什么我真的不明白的地方。

最佳答案

Covariance vs contravariance vs invariance
Class<? extends URLClassLoader>是不变的。
因此,
Class<? extends URLClassLoader>不是Class<URLClassLoader>的子类型
在Java中,变量可以保存同一类型或子类型实例的引用。
因此,

Class<URLClassLoader> uclc = ucl.getClass();

无效。
另一方面,
Class<? extends URLClassLoader> uclc = ucl.getClass();

将是有效的。

关于java - 为什么不能分配I <?将Type>扩展为<Type>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52599206/

10-09 05:26