无论如何在类构造函数中获取泛型类型以将其传递给父构造函数?
给定基类:
public class BaseSupport<T>{
private Class<T> type;
public BaseSupport(Class<T> type){
this.type = type;
}
}
无论如何都要创建一个子类来执行此操作吗?
public class Support<T> extends BaseSupport<T> {
public Support() {
// is there anyway to know what "T" is here?
super( T.class );
}
}
最后,我只能创建一个类:
public class MyClass extends Support<OtherClass>{
// no need to explicitly define a constructor here since the Support class handles it
}
我知道Guava有TypeToken
来帮助检索泛型类型信息,但鉴于super()
必须是构造函数中调用的第一个方法,我不能用它来提取类型要传递给父类的信息。
我怀疑这是不可行的,但我想我会问是否有任何我在Java 7中不知道的功能/技巧,因为&#39; T&#39;将在编译时提供。
答案 0 :(得分:1)
你可以有效地做到这一点。
public class MyClass extends Support<OtherClass>{
// no need to explicitly define a constructor here since the Support class handles it
public MyClass() {
super(OtherClass.class);
}
}
在支持方面,有一个接受Class
类型的构造函数,并按照上面的说法调用super
关键字(一起消除T.class
)。
更新:或者,您可以使用Reflection在ParameterizedType
课程上获取BaseSupport
,而无需向BaseSupport
公共构造函数提供参数。
<强>资源:强>
答案 1 :(得分:1)
您是否看到了TypeToken
文档中提到的选项?
使用(通常是匿名的)子类捕获泛型类型,并根据知道类型参数的上下文类来解析它。例如:
abstract class IKnowMyType<T> { TypeToken<T> type = new TypeToken<T>(getClass()) {}; } new IKnowMyType<String>() {}.type => String