如果我有类似的话:
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
如何捕获T
的类以便我可以实例化它?是否有防止类型擦除的变通方法?我甚至不需要访问T
的方法,X
会很好,但我需要返回T
。
答案 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的数组。