以下语句:

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();
    

    将是有效

    09-26 06:36