6

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

4

4 回答 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 回答