【发布时间】:2012-03-02 05:43:11
【问题描述】:
我有一个接受类型标记的类,然后生成由该类型参数化的类型的对象(好吧,它比这更复杂一点,但这是一个简洁的例子):
public class Test {
public static void main(String[] args) throws Exception {
Holder<HashSet<Integer>> i = newObjectHolder(HashSet.class); // this fails
}
static class Holder<T> {
public Holder(T newInstance) {}
}
public static <T> Holder<T> newObjectHolder(Class<T> typeToken) throws Exception {
Constructor<T> ctor = typeToken.getConstructor();
return new Holder<T>(ctor.newInstance());
}
}
如果传递非泛型类型,这可以正常工作,例如:
Holder<Integer> i = Test.newObjectHolder(Integer.class);
但是,如果传递的类型标记是通用的,则它不起作用,如上面所示的行:
Holder<HashSet<Integer>> i = Test.newObjectHolder(HashSet.class); // this fails
我遇到了问题,但有解决方案吗?如果不降低安全性,我可以在 newObject 的代码中添加 @SuppressWarnings("unused")。直观地说,似乎 newObject 应该能够进行有效的转换,我们知道一个已擦除泛型类型的“新”对象与任何其他对象相同,并且我们没有在方法中使用 T .
【问题讨论】:
-
这是一个错误,是在我的“简洁”阶段从真实代码中引入的。让我解决它。
-
已修复。请注意,它仍然不起作用。
-
对
Foo.newObject的调用应该是对Foo.newObjectHolder的调用吗? -
是的,我的示例在早期编辑以解决 Nishant 提出的问题后不一致。我现在用sscce.org 更新了它