[英]Generics and sorting in Java
假設您用Java編寫了一個靜態函數來對數組進行排序,就像Arrays.sort()
。 Arrays.sort()
的問題在於,它接收一個Object數組,如果其元素未實現Comparable
,則拋出ClassCastException
。
因此,您希望您的函數將Comparable
子類型的數組作為參數接收。 這樣的事情可能會起作用:
static <T extends Comparable> void sort(T[] array);
該簽名的問題在於,例如,您仍然可以傳遞帶有Integers和Strings的Comparables數組,這將導致RuntimeException
。
因此,如何創建一個僅接收其元素實現Comparable並具有相同類型(例如Integer,String等)的數組的函數?
采用
static <T extends Comparable<? super T>> sort(T[] array);
這是完成任務的最一般的規范。 它斷言,基本上T
是可以與自身進行比較的類型。
Dirk的答案是您能得到的最好的答案,但是Google Collections的用法與您寫的完全一樣,以避免javac中的錯誤:
為什么在各種API中使用類型
<E extends Comparable>
extended<E extends Comparable>
而不被“完全泛化”? 不是<E extends Comparable<?>>
,<E extends Comparable<E>>
還是<E extends Comparable<? super E>>
<E extends Comparable<? super E>>
?最后的建議是正確的,如有效Java中所述。 但是,我們將在無參數方法上使用
<E extends Comparable<E>>
,以解決一個可怕的javac錯誤。 當您使用類似java.sql.Timestamp
的非常不同的類型(與超類可比)時,這將給您帶來問題。 (需要更多說明。)
發件人: http : //code.google.com/p/google-collections/wiki/常見問題解答
現在由您決定...
在Java 1.5以后的世界中,引用數組只是底層實現細節。 更喜歡收藏。
如果您對引用數組感興趣,則出於某些特殊原因,您將意識到它們確實與泛型無關。 您不能(合理地)使用通用類型的數組,例如Comparable<String>
。 這意味着,如果以與Collections.sort
類似的方式來泛化Arrays.sort
,它將受到過度約束。
由於數組類型的特殊性,如果您確實想過分約束類型, 我認為 sort
可以比Collections.sort
更簡單地編寫,而不會犧牲任何重要的信息。
public static <T extends Comparable<T>> sort(T[] array)
如果要與前泛型二進制兼容,則需要采取一些技巧以類似於Collections.min
方式返回到Object[]
簽名。
public static <T extends Object & Comparable<T>> sort(T[] array)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.