在Java中捕获泛型类型

时间:2012-10-07 05:44:45

标签: java generics type-erasure

如果我有类似的话:

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

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

3 个答案:

答案 0 :(得分:4)

您唯一能做的就是将T类作为额外参数传递给test()或在类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;
    }
}

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

答案 1 :(得分:3)

将其定义为:

class Test<T extends X>
{
    public T test(Class<T> c)
    {
        T t = c.newInstance();
        return t;
    }
}

并使用它:

Test<Foo> t = new Test<Foo>();
t.test(Foo.class);

答案 2 :(得分:0)

您无法直接执行此操作,但您可以添加T实现的接口来创建实例或T的数组。