是否在类构造函数中获取泛型类型以便将其传递给父构造函数?
给定基类:
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中是否有我不知道的功能/技巧,因为"t"在编译时是可用的。
您看到TypeToken
文档中提到的选项了吗?
捕获具有(通常是匿名的)子类的泛型类型,并根据知道类型参数的上下文类来解析它。例如:
abstract class IKnowMyType<T> { TypeToken<T> type = new TypeToken<T>(getClass()) {}; } new IKnowMyType<String>() {}.type => String
您可以有效地做到这一点。
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在BaseSupport
类上获取ParameterizedType
,而不需要向BaseSupport
公共构造函数提供参数。
资源:
- 反映泛型
- StackOverflow的相关答案