[英]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
方法。
它將依賴於鍵的equals
和hashcode
實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.