[英]Constructor with generic class is undefined
我遇到了一個我不明白的愚蠢問題。
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);
如果有人有想法,那就太棒了,不要讓我把頭撞到牆上。
沒有Collection<String>.class
這樣的東西就是問題所在。 你的選擇包括
TypeToken
你無能為力。 只是圍繞它
new Foo<Collection<String>, String>(
(Class<Collection<String>>)(Class<?>)Collection.class,
String.class);
沒有運氣,因為類型擦除,請看這個問題 。
但是,原始集合類和元素類可用於生成類型安全的Collection<String>
對象。 因此,刪除集合中E的冗余,作為集合。
對於您的用例,您可以放松構造函數參數類型
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);
^^^ ^^^^
好,
我看過別人的答案而不是最好的......
在Oreilly Tiger書中(對於第5版)(p167),他們做了一個非常明確的陳述,即構造函數在其簽名中不能有通配符......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.