gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:23:53 25 4
gpt4 key购买 nike

假设有两个类,即PetDog . 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 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com