如何将通用类型T
转换为对象Class<T>
?
Class<T> T.class
或Class<T> T.getClass()
之类的内容不起作用,因为T
不是变量。
一个函数应如下所示:
public Class<T> getType() {
return // Class of T
}
背景资料:
我有一些课程Class1<T>
,Class2<T>
,...所有extend ParentClass<T>
。 ParentClass
具有getType()
功能。
我正在寻找一种更优雅的方式来获取类型,然后创建变量Class<?> type
并以这种方式保存类型。
答案 0 :(得分:4)
您在运行时不知道T
(因为Type erasure)。
基本上,MyWonderfulClass<String>
将在运行时变为MyWonderfulClass<Object>
,因此除非您直接在构造函数或setter中提供类,否则您没有机会检索它:
//class is a reserved keyword so I call it clazz instead.
public MyClass(Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> getType() {
return this.clazz;
}
您还可以强制子类实现getType() : Class<T>
。
答案 1 :(得分:0)
你可以这样做:
public class Parent<T> {
private final Class<T> clazz;
public Parent(Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> getType() {
return clazz;
}
}
public class Foo<T> extends Parent {
public Foo(Class<T> clazz) {
super(clazz);
}
}