簡體   English   中英

類聲明中的泛型類型

[英]Generic type in class declaration

我有

1)基本界面,

2)實現此接口的幾個類,

3)和一個我想接受的泛型類,作為參數,任何實現類

我嘗試過以下方法:

public class Foo extends Bar<? extends SomeInterface> {

    public Foo(List<? extends SomeInterface> someInterfaceList) {
        super(someInterfaceList);
    }

    ...
}

我收到錯誤No Wildcard Expected 在我的代碼的其他地方,我有List<? extends SomeInterface> List<? extends SomeInterface>我沒有收到錯誤,為什么我在這里遇到問題? 我該如何解決這個問題並仍能獲得理想的結果?

我試過搜索'沒有通配符預期'和'通知卡在課堂聲明'無濟於事。 提前致謝!

聽起來你想聲明一個你將在別處引用的泛型類型參數。 通配符僅在類型僅使用一次時才有意義,並且在為類聲明泛型類型參數時這沒有任何意義。

試試這個:

public class Foo<T extends SomeInterface> extends Bar<T> {

    public Foo(List<T> someInterfaceList) {
        super(someInterfaceList);
    }

    ...
}

在編寫代碼時,類的用戶無法為Bar<>指定泛型類型參數,因為Foo本身不是泛型類型。

此外,如果這是可能的,那么Bar<>的泛型參數可能與List<>的泛型參數不同 - 只要兩個類型都實現了SomeInterface ,就不會出現編譯時問題。這些定義,但是當您錯誤地認為兩種類型必須相同時,可能會出現更加混亂的錯誤消息。

所以, 一旦聲明泛型類型為通用參數傳遞給Foo類,然后使用(該類型T在我的例子),在其他地方是指那種類型,而不是接受,可能指的不是同一類型的一些新的泛型類型參數的。

我不確定你在尋找什么,所以如果你能提供更多的細節,它可能會有所幫助。 也許您可以更具體地了解您計划如何實例化和使用這些對象?

無論如何,我想你可能正在尋找這樣的東西:

import java.util.List;

public class Foo<T extends SomeInterface> {
  public Foo(List<T> someInterfaceList) {
    for (T item : someInterfaceList) {
      // do something with each item
    }
  }
}

class Bar<T> {}

interface SomeInterface<T> {
  T x(T y);
}

或者,您也可以使用以下內容作為構造函數:

public Foo(List someInterfaceList) {

但是你不會有一種簡單的方法來獲取列表中項目的類型T.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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