获取<t>课程 - 可能吗?

时间:2017-04-15 19:05:10

标签: java

我有一个抽象类:

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

有什么建议吗?

2 个答案:

答案 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);
        }
    }
}