如果我有这样的:捕获泛型类型在Java中
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
我怎样才能捕捉T
的课,所以我可以实例呢?是否有解决方法来防止类型擦除?我甚至不需要访问T
的方法,X
的做得很好,但我需要返回一个T
。
如果我有这样的:捕获泛型类型在Java中
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
我怎样才能捕捉T
的课,所以我可以实例呢?是否有解决方法来防止类型擦除?我甚至不需要访问T
的方法,X
的做得很好,但我需要返回一个T
。
您可以做的唯一事情是将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;
}
}
或者你可以传递一个工厂对象来达到同样的效果。当你需要使用默认构造函数以外的东西时,这很有效。
把它定义为:
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);
你不能直接这样做,但你可以添加牛逼实现创建实例的接口,或T的数组。
mClass.getConstructor()的newInstance()是更好的,因为它没有隐藏检查异常,但适当的包装他们的InvocationTargetException。 –