java - 提取参数化类型的值时,将参数化类型类参数转换为子类形式

标签 java generics inheritance casting parameterized-types

如何将参数化类型类参数转换为其子类形式? 我读过很多关于提取类型参数的值的示例和问题,您应该有一个接口(interface)或抽象类,您应该从中扩展

考虑下面的代码

type = (Class<T>) ((ParameterizedType)(getClass().getGenericSuperclass())).getActualTypeArguments()[0];

使用上面的代码,您可以将“type”变量转换为 (Class) 表示的内容。假设 是一个 Person.class

下面是完整的实现,其中 Person 类是传递到通用父类(super class)类型参数参数的值。当我创建通用子类的实例并我传递 Person 类型参数参数的子类时,它总是被转换为 Person。 type == Student.class 打印 false 或者即使我打印类型,它总是打印 Person 而不是 Student。我怎样才能做到这一点?我想要的东西可能吗?

通用子类

public class GenericSubClass<T extends Person> extends GenericAbstractSuper<Person> {

public Class<T> type;

@SuppressWarnings("unchecked")
public GenericSubClass() {

    type = (Class<T>) ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];

    System.out.println(type.getSimpleName());
    System.out.println(type == Student.class);
} 

public static void main(String[] args) {

    GenericSubClass<Student> genStud = new GenericSubClass<Student>();
 // GenericSubClass<Employee> genEmp = new GenericSubClass<Employee>();
 // GenericSubClass<Person> genPer = new GenericSubClass<Person>();
  }
}

通用 super 抽象类

public abstract class GenericAbstractSuper<T> {
}

拜托,我真的需要一些帮助。我找不到类似的问题。

最佳答案

您需要创建 GenericSubClass 的子类、匿名或其他方式。

GenericSubClass<Student> genStud = new GenericSubClass<Student>(){};

现在

getClass().getGenericSuperclass()

将返回 Type对于 GenericSubClass<Student>你可以提取Student .

以前,

getClass().getGenericSuperclass()

正在返回GenericAbstractSuper<Person>所以你正在提取 Person .

此技巧用于类型标记

关于java - 提取参数化类型的值时,将参数化类型类参数转换为子类形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25570889/

相关文章:

c - 有没有办法让 GCC/Clang 知道 C 中的继承?

不使用 element.hashCode() 的 java.util.Set 实现

java - BorderLayout 的小问题

java - Struts 1.x升级

c++ - 给定迭代器检索容器的比较函数

C# 使用通过反射找到的类型作为泛型

java - 如何创建通用原始数组?

java - 使用 JUnit 5 的 @ParametrizedTest 与 @TestFactory Stream<DynamicTest> 之间的区别/优点是什么?

ruby - Ruby 子类实例变量可以_overwrite_ 父类(super class)的(同名)吗?

c++ - C++对析构函数的 undefined reference 和对返回的局部变量的引用