簡體   English   中英

Java中的上邊界通配符

[英]Upper Bounded wildcards in Java

我有兩個通用的方法來計算List的元素總和。 方法的簽名是

  1. double method1(List<? extends Number> list) - 這里我使用的是通配符。

  2. <U extends Number> double sumOfList1(List<U> list) - 這里有一個type參數的名稱。

這兩者之間有什么區別,或者它們在功能方面是否相同? 使用類型參數名稱而不是通配符有什么優勢?

public static double sumOfList(List<? extends Number> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

 public static <U extends Number> double sumOfList1(List<U> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

謝謝。

絕對沒有區別,聲明U的目的是讓你可以使用它:

public static <U extends Number> void doSomething(List<U> list, Consumer<U> sink) {
    list.forEach(sink::accept)
}

這意味着你不關心U什么 ,但它必須從Number擴展。 您關心的是List包含的類型與Consumer可以接受的類型兼容。


或者,您可以在方法內使用U來聲明泛型類型的新實例:

public static <U extends Number> List<U> copy(List<U> list) {
    List<U> copy = new ArrayList<>();
    copy.addAll(list)
    return copy;
}

是的,我知道,有更簡潔的方法可以做到這一點 - 請將其視為一個說明性的例子

由於您沒有在此方法中使用U ,因此它們沒有區別。

由於類型擦除,最終執行的代碼是相同的,因此使用一個而不是另一個沒有區別。

類型擦除在本網站中解釋如下:

僅在編譯時強制執行類型約束並在運行時丟棄元素類型信息的過程。

暫無
暫無

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

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