我遇到了一个我不明白的愚蠢问题。
class Foo<T extends Collection<E>, E> {
private Class<T> collectionClass;
private Class<E> elementClass;
public Foo(Class<T> collectionClass, Class<E> elementClass) {
this.collectionClass = collectionClass;
this.elementClass = elementClass;
}
}
当我尝试运行此
时Foo<Collection<String>, String> foo =
new Foo<Collection<String>, String>(
Collection.class,
String.class);
我收到编译错误
java.lang.Error: Unresolved compilation problem:
The constructor Foo<Collection<String>,String>(Class<Collection>, Class<String>) is undefined
为什么?如果我擦除泛型,那就没关系
Foo foo =
new Foo(
Collection.class,
String.class);
如果有人有这个想法,那就太棒了,让我不要把头撞到墙上。
答案 0 :(得分:4)
没有Collection<String>.class
这样的问题。您的替代方案包括
TypeToken
答案 1 :(得分:1)
你无能为力。只是围绕它施展
new Foo<Collection<String>, String>(
(Class<Collection<String>>)(Class<?>)Collection.class,
String.class);
答案 2 :(得分:0)
没有运气,因为类型擦除,请参阅this question。
但是,可以使用原始集合类和元素类来生成类型安全的Collection<String>
对象。因此,将Collection中的E的冗余删除为Collection。
答案 3 :(得分:0)
对于您的用例,您可以放松构造函数参数类型
public Foo(Class<?> collectionClass, Class<E> elementClass)
{
this.collectionClass = (Class<T>)collectionClass;
this.elementClass = elementClass;
}
Foo<Collection<String>, String> foo = new Foo<>(Collection.class, String.class);
类型检查较少,因此用户必须确保未传入错误的类,例如
Foo<Set<String>, String> foo = new Foo<>(List.class, String.class);
^^^ ^^^^
答案 4 :(得分:0)
确定,
我看过其他人的答案而不是最好的答案......
在Oreilly Tiger书中(对于第5版)(p167),他们做了一个非常明确的陈述,即构造函数不能在其签名中有一个通配符......