首頁>Program>source

有人可以解釋為什麼我们使用 ?Collection 泛型。

例如:

List<? extends Number> numberlist;
 List<? super Integer> numberlist;
最新回復
  • 5月前
    1 #

    萬用字元引入了如何使用集合的限製。

    例如,与 List<? extends Number> ,我無法將新元素添加到列表中.這是因為我只知道列表是 Number的某種子型別 ,但我不知道實際的子型別是什麼(所以我怎麼知道要添加什麼?).例如,使用以下代碼:

    public void doSomethingWith(List<? extends Number> numbers) {
        numbers.add(Integer.valueOf(0)); // Won't compile
    }
    

    由於這两个方法呼叫均合法,因此無法編譯:

    doSomethingWith(new ArrayList<Integer>());
    doSomethingWith(new ArrayList<Double>());
    

    您可以做的是从列表中read个元素:

    // This will all compile
    public void doSomethingWith(List<? extends Number> numbers) {
        for (Number number : numbers) {
            // Do something with number
        }
        // OR
        Number number = numbers.get(0);
        // OR
        Number number = numbers.remove(0);
    }
    

    呼叫诸如 get之類的方法 將返迴某種 Number ,由於 ? extends Number,我们知道這一事實 ,因此我们可以將其视為用於阅讀目的。

    另一方面, List<? super Integer> 結果完全相反.我無法再从列表中讀取內容,但可以對其进行寫操作.我知道無論什麼 是的,這绝對是 ?的超一流 ,因此列表的具體型別肯定会接受 Integer value观.例如:

    Integer
    

    该代碼是完全合法的.但是,如果您想从列表中讀取內容,唯一的方法是使用 public void doSomethingWith(List<? super Integer> integers) { integers.add(Integer.valueOf(0)); } 因為其他任何事情都需要強製轉換(需要知道其具體型別):

    Object
    

    for (Object obj : integers) // OR Object obj = integers.get(0); // OR Object obj = integers.remove(0);

    這是實際發生的事情.当您指定 What's Really Happening ,您將使采用元素作為引數的任何方法都不可用.實際上,如果您尝試在 ? extends Number上使用Ctrl + Space在Eclipse中自動完成代碼 ,它顯示了 List<? extends Number> 作為 null中的引數型別 方法之類的.同時,保證所有return元素的方法至少返迴某種型別的 add ,尽管您無法確切知道 Number的哪个子類 可能是這樣。

    当您指定 Number ,您正在製作元素作為引數的任何方法,以確保它们將接受 ? super Integer 值(和 Integer的子類 以及).這使您可以呼叫诸如 Integer之類的方法 因為你知道他们会接受 add 型別.同時,所有保證return的方法只能保證返迴something,但是我们不知道是什麼,因此,保證所有返迴元素的方法仅保證返迴 Integer

    PECS是一个很好的首字母縮寫詞,它的意思是"P诱匯器Extends,ConsumerSupers".這意味着,如果您希望列表為您提供某些东西,則它是生产者,應使用 Object .如果您希望列表接受您的資訊,那麼它就是消费者,因此您可以使用 extends .有關更多資訊,請參见此答案。

    super

    两者都做! But what if I have a wildcard with no bounds? 限製您呼叫以通用型別為引數的方法,並使所有返迴通用型別的方法返迴 <?> .這是因為我们不知道型別是什麼.例如,將所有這些分配都放入 Object 是合法的:

    List<?>
    

    以此類推。

  • 5月前
    2 #

    它是萬用字元. ? 表示任何繼承自number或Integer類的超類的類都將起作用.希望這可以帮助. :)

  • 5月前
    3 #

    当您學習萬用字元和 List<?> list; list = new ArrayList<Integer>(); list = new ArrayList<String>(); list = new ArrayList<MyClass>();之間的區別時 和 extends ,只需記住PECS.该規則非常容易記住.

  • 5月前
    4 #

    super 用於在使用泛型時定義萬用字元。

    示例中的語句告诉您List接受 ?型別的任何物件

  • 5月前
    5 #

    Number 意思是任何班級

    ?
    

    表示MyClass或MyClass本身的任何子類。

    ? extends MyClass

  • batch file:在windows中:如何以程式設計方式在另一个使用者上下文下以管理員模式啟動程序?
  • sql:oracle —將oracle表中的多个逗號分隔值拆分為多行