簡體   English   中英

HashMap的語法有什么用 <Comparable<?> ,東西&gt;

[英]what is the use of syntax HashMap<Comparable<?>, something>

我正在處理現有代碼,並且遇到以下語法:

HashMap<Comparable<?>, something>

為什么我們將Comparable<?>作為鍵? 在所有情況下這將是有用的?

從類型的角度來看,這意味着HashMap的鍵可以是實現Comparable任何類型,而與type參數Comparable

從應用程序的角度來看,這還不清楚

Comparable的正常用法是這樣的。

public class SomeType implements Comparable<SomeType> {
    public int compareTo(SomeType other) { ... }
    // etcetera
}

換句話說,一個SomeType可以與另一個進行比較SomeType 如果您嘗試將SomeType與其他類型進行比較,則基於這些類型是無法比較的,您將期望ClassCastException ...。 (和IIRC, Comparable的javadocs 建議 compareTo拋出CCE ...用於不可比較的類型。)

那么,類型為Comparable<?>的鍵的用途是Comparable<?> 您希望它與不同類型的產品具有可比性嗎?

  • 如果是這樣,您如何實現一個compareTo方法,以有意義的方式this方法與任何其他Comparable<?>進行比較。

  • 如果不是,那么將鍵設為Comparable<?>什么用? 您將獲得CCE ...

簡而言之,我認為這是一個設計錯誤。 我認為最好寫:

  HashMap<T extends Comparable<T>, Something>

那是一個具體的實現,其中唯一的限制是實現Comparable接口。 使用通配符以指示支持Comparable<T>任何實現。 為了不使用原始類型,通配符是必需的,因為引入了泛型,因此強烈不建議使用此通配符。 如果使用原始類型,您會注意到編譯器會立即警告您,並建議您改用泛型。 注意, Comparable<T>接口本身是通用的。

當您想對按鍵應用命令時,這種按鍵非常有用。 考慮一個簡單的場景,在該場景中您要對鍵進行排序。 如果您使用的是不可變但不可比較的鍵,則不可能實現。

使用Comparable<?>作為鍵,映射定義指定它接受任何Object作為實現Comparable接口的鍵。

通常,建議對原始類型Comparable使用通配符Comparable<?> 這里描述的原因。

從技術上講,對於HashMap ,強制鍵以實現Comparable<?>在任何情況下都沒有用,因為HashMap在內部將不使用Comparable接口的compareTo方法。

它將依賴於鍵的equalshashcode實現。

暫無
暫無

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

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