问题描述
我正在努力从对象中获取第二个泛型的类型。
抽象类采用两种通用类型T和S
abstract class Concept<T,S> {
public Concept() {
//do nothing
}
public final Class<?> getTypeparam() {
ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
Class<?> result = (Class<?>) parameterizedType.getActualTypeArguments()[0];
return result;
}
}
在此派生类中(在这种情况下为T)定义了泛型:
public class Decision<S> extends Concept<String,S>{
public Decision () {
super();
System.out.println(getTypeparam()); //returns the first parameterized type. How do I get the second one?
}
}
当我现在运行它时,我得到了第一个经过parmerized的泛型。大。但是我要如何摆脱第二个?
public class Main {
public static void main(String[] args){
Decision<Boolean> myBooleanDecision = new Decision<>();
}
}
解决方法
您的问题是基于您不清楚自己的要求的事实。
您的方法签名如下:public final Class<?> getTypeParam()
但是您忽略的是:类的类型参数的数量不是固定的。基本的Concept类允许两个类型的参数,但是Decision子类将第一个参数“固定”为String。
因此:您必须确定自己实际想要/需要的东西。有多种解决方案,例如:
-
public final Class<?> getFirstParam()
...始终返回索引0 -
public final Class<?> getSecondParam()
...始终返回索引1(对于只有1个泛型类型参数的类,显然会失败) -
public final List<Class<?>> getParams()
...返回包含所有条目的列表
这是您的选择空间。选择哪种解决方案完全取决于该方法的目的(我们什么都不知道)。
我个人会选择第三个选项,因为它将适用于0、1,... n类型参数,而无需进行任何更改。
,更改脱节:
Decision<Boolean> myBooleanDecision = new Decision<>("Binary Decision") {};
现在,这将导致第二个泛型:
Class<?> result = (Class<?>) parameterizedType.getActualTypeArguments()[0];
输出为:
class java.lang.Boolean