以下语句:
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分配给),但这是显而易见的,并且可以理解。
注意:我在Eclipse Luna下进行编码,所以我不知道这是Luna Quirk还是泛型中我真的不了解的东西。
最佳答案
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();
将是有效。