簡體   English   中英

Java中的泛型和排序

[英]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.

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