假设我有一个包含私有 T _member 的 Java 类参数化。我想编写一个默认构造函数(无参数),它以某种方式将我的 T _member 初始化为一些已知的类型 T 特定值(如整数的 -1,浮点数的 Float.MAX_VALUE ......)。那可能吗?我尝试了 new T(),但编译器不喜欢这样。还是我什么都不做,保证会为我调用默认构造函数?
问问题
1739 次
4 回答
5
由于类型擦除,在运行时“没有 T”。
解决方法是将 的实例传递Class<T>
给构造函数,如下所示:
public class MyClass<T> {
T _member;
public MyClass(Class<T> clazz) {
_member = clazz.newInstance(); // catch or throw exceptions etc
}
}
顺便说一句,这是一个非常常见的代码模式,用于解决“用 T 做某事”的问题
于 2012-08-03T20:29:37.127 回答
3
Java 中没有初始化表达式的每个字段都会自动初始化为已知的默认值。是的,在这种情况下,它是类型 T -- 的已知值null
。
于 2012-08-03T23:06:59.170 回答
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.
}
}
}
于 2012-08-03T20:28:40.307 回答
0
事实上有一种方法可以做到这一点,这里有一个链接来回答相关的 SO 问题。
因此,实际上您的主要问题是否有可能在运行时获得泛型成员类?是的,有 - 使用反射。
大约一年前,当我得到这个答案时,我对其进行了测试并进一步研究了反射。事实上,有几个情况下它不能按原样工作(注意继承的情况),但总的来说,声称这是不可能的是错误的。
但是,我强烈不建议这样做。
编辑。令人惊讶的是,我在该答案下方找到了我自己的评论 :) 在下一条评论中,作者提供了关于泛型反射的原始文章的链接。
于 2012-08-03T20:44:24.863 回答