簡體   English   中英

具有泛型類的構造函數未定義

[英]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這樣的東西就是問題所在。 你的選擇包括

  • 不要使用反射; 你為什么用反射?
  • 接受不安全演員的需要
  • 使用各種工具之一在運行時引用泛型類型,例如Guava的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM