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

时间:2014-08-29 14:55:54

标签: java generics inheritance casting parameterized-types

如何将Parameterized类型类参数转换为其子类形式? 我已经阅读了很多关于提取类型参数值的示例和问题,你应该有一个接口或抽象类,你应该扩展

考虑以下代码

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

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

下面是完整的实现,其中Person类是传递给泛型超类类型参数参数的值。当我创建泛型子类的实例并且我传递Person类型参数参数的子类时,它总是被转换为Person。 type == Student.class 打印 false ,或者即使我打印该类型,它始终打印而不是学生。我怎样才能实现这一目标?是我想要的东西吗?

通用子类

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

通用超级抽象类

public abstract class GenericAbstractSuper<T> {
}

我真的需要一些帮助。我无法找到类似的问题。

1 个答案:

答案 0 :(得分:3)

您希望创建GenericSubClass的子类,匿名或其他。

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

现在

getClass().getGenericSuperclass()

将为Type返回GenericSubClass<Student>,您可以提取Student

以前,

getClass().getGenericSuperclass()

正在返回GenericAbstractSuper<Person>,因此您正在提取Person

此技巧用于类型令牌