5

如果我有类似的东西:

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

如何捕获T的类以便实例化它?是否有防止类型擦除的解决方法?我什至不需要访问T's 的方法,X's 就可以了,但我需要返回一个T.

4

3 回答 3

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;
    }
}

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

于 2012-10-07T05:49:20.347 回答
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);
于 2012-10-07T05:49:09.943 回答
0

你不能直接做,但是你可以添加一个T实现的接口来创建一个实例,或者一个T的数组。

于 2012-10-07T05:49:09.870 回答