Java通用成员初始化

时间:2012-08-03 20:27:18

标签: java generics

假设我有一个参数化的Java类,其中包含一个私有的T _member。我想写一个默认构造函数(没有参数),它以某种方式将我的T _member初始化为一些已知的,类型为T的特定值(对于Integer为-1,对于Float为Float.MAX_VALUE ...)。那可能吗?我尝试了新的T(),但编译器不喜欢这样。或者我什么都不做,保证为我调用默认构造函数?

4 个答案:

答案 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的链接。

因此事实上你的主要问题是否有可能性在运行时获得通用成员类?是的,有 - 使用反射。

大约一年前,当我回答这个问题时,我对它进行了测试并对反射进行了一些调查。事实上,有几个案例当它不能正常工作(具有继承的案件),但总的来说,声称这是不可能的是错误的。

但是,我强烈不建议这样做。

编辑。令人惊讶的是,我在下面的答案中找到了自己的评论:)在下一条评论中,作者将链接到关于泛型反思的原始文章。