在Java中捕获泛型类型

rid*_*rid 5 java generics type-erasure

如果我有类似的东西:

class Test<T extends X> {
    public T test() {
        T t = /* ... */;
        return t;
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何捕获T类,以便实例化它?是否有防止类型擦除的变通方法?我甚至不需要访问T的方法,它X会做得很好,但我需要返回一个T.

Ted*_*opp 4

您唯一能做的就是将 T 的类作为额外参数传递给test()class 或设置 class 中的成员字段Test。您无法阻止类型擦除。

class Test<T extends X> {
    private Class<T> mClass;
    public Test(Class<T> c) {
        mClass = c;
    }
    public T test() {
        T t = mClass.newInstance();
        return t;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以传递一个工厂对象来达到相同的效果。当您需要使用默认构造函数以外的东西时,这很有效。