假设我有一个参数化的Java类,其中包含一个私有的T _member。我想写一个默认构造函数(没有参数),它以某种方式将我的T _member初始化为一些已知的,类型为T的特定值(对于Integer为-1,对于Float为Float.MAX_VALUE ...)。那可能吗?我尝试了新的T(),但编译器不喜欢这样。或者我什么都不做,保证为我调用默认构造函数?
答案 0 :(得分:5)
由于type erasure,在运行时“没有T”。
绕过它的方法是将Class<T>
的实例传递给构造函数,如下所示:
public class MyClass<T> {
T _member;
public MyClass(Class<T> clazz) {
_member = clazz.newInstance(); // catch or throw exceptions etc
}
}
顺便说一句,这是一个非常常见的代码模式,可以解决“用T做事”的问题
答案 1 :(得分:3)
这不是直接可能的,因为无法保证T
甚至具有默认构造函数。但是,你可以想象使用newInstance
的反射来做到这一点。请务必抓住可能引发的任何异常。
public class MyClass<T> {
private T _member;
public MyClass(Class<T> cls) {
try {
_member = cls.newInstance();
} catch (InstantiationException e) {
// There is no valid no-args constructor.
}
}
}
答案 2 :(得分:3)
没有初始化表达式的Java中的每个字段都会自动初始化为已知的默认值。是的,在这种情况下,它是T类型的已知值 - null
。
答案 3 :(得分:0)
实际上是这样做的方法,这里是关于相关SO问题的answer的链接。
因此事实上你的主要问题是否有可能性在运行时获得通用成员类?是的,有 - 使用反射。
大约一年前,当我回答这个问题时,我对它进行了测试并对反射进行了一些调查。事实上,有几个案例当它不能正常工作(具有继承的案件),但总的来说,声称这是不可能的是错误的。
但是,我强烈不建议这样做。
编辑。令人惊讶的是,我在下面的答案中找到了自己的评论:)在下一条评论中,作者将链接到关于泛型反思的原始文章。