假设有两个类,分别是Pet
和Dog
。 Pet
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 Instance
的class 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/