Java通用成员初始化

Fra*_*ank 6 java generics

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

Boh*_*ian 5

由于类型擦除,在运行时"没有T".

绕过它的方法是将一个实例传递Class<T>给构造函数,如下所示:

public class MyClass<T> {

    T _member;

    public MyClass(Class<T> clazz) {
        _member = clazz.newInstance(); // catch or throw exceptions etc
    }

}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是一个非常常见的代码模式来解决"用T做事"的问题

  • 你的意思是*类型*擦除,我相信?(如果*运行时*自行删除会有点不好;-) (3认同)

new*_*cct 3

Java 中没有初始化表达式的每个字段都会自动初始化为已知的默认值。是的,在这种情况下,它是 T 类型的已知值 -- null