java - 为什么 Class.getSuperClass() 方法不能准确获取父类(super class)类型实例?

标签 java class rtti

假设有两个类,分别是PetDogPet class 是 Dog 的父类(super class)类。

问题01:

当我如下编码时,发生编译错误:Type mismatch: cannot convert from Class<capture#2-of ? super Dog> to Class<Pet>

Class<Pet> c1 = Dog.class.getSuperclass();

它必须是这样的:

Class<? super Dog> c2 = Dog.class.getSuperclass();

此外,当我使用c2.newInstance()时,它只返回 Object实例。为什么我不能直接获取 Class Instanceclass Pet

问题02:

当我 System.out 时 c2.getName() ,它输出"pet" !这样c2就得到了我想要的信息。

我对这些真的很困惑。有人可以提供任何帮助吗?非常感谢!

最佳答案

Java 中的反射 API 比泛型要古老得多。 RTTI 中的一些方法反射(reflect)了这一点。

此外,RTTI 是一个运行时功能,而泛型是一个编译功能。有时,编译器没有足够的信息来检查运行时类型是否正确。

但是,例如您的 newInstance示例无效。

public class Test {
    class Pet {}

    class Dog extends Pet {}

    public static void main(String[] args) throws Exception {
        Class<Dog> dogClass = Dog.class;
        Dog dog = dogClass.newInstance();
    }
}

编译没有问题,从Class<T>开始方法声明为T newInstance()

如果我们采用getSuperClass()例如,您必须首先了解编译器不知道什么 getSuperClass()做。它只查看方法声明。这就是为什么它不知道返回的类实际上是 Pet 。它只是将变量的类型与 getSuperClass 返回的对象类型进行比较。变量是Class<Pet>返回的对象是 Class<? super Dog> ,那不一样。编译器不会模拟 getSuperClass实现并且不知道返回的确切对象。

关于java - 为什么 Class.getSuperClass() 方法不能准确获取父类(super class)类型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15862836/

相关文章:

java - Prettyfaces:在观察特定的 url 模式时将 bean 属性设置为某个常量值

java - Angularjs 将文件多部分 FormData 中的空值传递给 Spring MVC

Java如何从另一个jar加载一个类到我的jar以及如何使用它

java - 在没有第三方库的情况下从Python启动JVM?

delphi - 如何在运行时获取接口(interface)的名称?

delphi - 如何在运行时设计器中隐藏继承的已发布属性?

java - 如何使用 continue 跳过多行

java - 无法获取 ajax 调用中从服务器传递的响应的整数值?

javascript - 如何将一个类嵌套在另一个类中?

c++ - 编译器不可知的运行时类型信息?