我有一个抽象类:
abstract class DmValue<T>
许多课程扩展了它,例如:
class DmBoolean extends DmValue<Boolean>
class DmText extends DmValue<String>
class DmDate extends DmValue<Date>
我的问题是如何找到T级?
我需要写一个静态函数:
static Class getT(Class<? extends DmValue> valueClass){...}
对于valueClass = DmText.class,getT函数应该返回String.class
在valueClass = DmBoolean.class的情况下,getT函数应该返回Boolean.class
有什么建议吗?
答案 0 :(得分:1)
在构造函数中传递Class<T>
,
abstract class DmValue<T> {
Class<T> cls;
public DmValue(Class<T> cls) {
this.cls = cls;
}
public Class<T> getValueType() {
return this.cls;
}
}
然后在您的子类中初始化它,例如
class DmBoolean extends DmValue<Boolean> {
public DmBoolean() {
super(Boolean.class);
}
}
然后您可以通过拨打getValueType()
来访问它。
答案 1 :(得分:0)
You can grab generic interfaces of a class by Class#getGenericInterfaces() which you then in turn check if it's a ParameterizedType and then grab the actual type arguments accordingly.
Type[] genericInterfaces = BarFoo.class.getGenericInterfaces();
for (Type genericInterface : genericInterfaces) {
if (genericInterface instanceof ParameterizedType) {
Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments();
for (Type genericType : genericTypes) {
System.out.println("Generic type: " + genericType);
}
}
}