2012-10-07 74 views
5

如果我有这样的:捕获泛型类型在Java中

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

我怎样才能捕捉T的课,所以我可以实例呢?是否有解决方法来防止类型擦除?我甚至不需要访问T的方法,X的做得很好,但我需要返回一个T

回答

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

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

+0

mClass.getConstructor()的newInstance()是更好的,因为它没有隐藏检查异常,但适当的包装他们的InvocationTargetException。 –

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); 
0

你不能直接这样做,但你可以添加牛逼实现创建实例的接口,或T的数组。