在java.util.Collections
類,我們有sort
方法的兩個變種,即需要任意對象的列表,並附有相應的Comparator
:翻譯從Java泛型通配符斯卡拉
public static <T> void sort(List<T> list, Comparator<? super T> comparator)
,而另一種名單Comparable
對象:
public static <T extends Comparable<? super T>> void sort(List<T> list)
我在想一個woulds如何轉化與博這樣的方法簽名沒有通配符的Scala。對於第一個版本,我翻譯的簽名字面上乍一看沒有編譯問題:
def sort[T](list: List[T], comparator: Comparator[_ >: T]) { ??? }
但後來我發現,我不能調用此方法具有以下參數:
val comparator = new Comparator[Object] {
def compare(o1: Object, o2: Object) = ???
}
val list = new ArrayList[Number]
sort[Object](list, comparator)
最後行給出此編譯錯誤,即使我明確指定類型T
爲Object
。
類型不匹配;找到:java.util.ArrayList [Number] required:java.util.List [Object]注意:數字<:對象,但Java定義的特徵列表在E中不變。您可能希望研究通配符類型,例如
_ <: Object
。 (SLS 3.2.10)
事實上,我發現甚至不可能直接調用唯一的Java方法,因爲它失敗時會出現相同類型的錯誤。
Collections.sort[Object](list, comparator)
至於相媲美列表框中的版本,我想出了這個聲明:
def sort[T <: Comparable[_ >: T]](list: List[T]) { ??? }
但是,這並不在所有的工作:
非法循環引用涉及類型T
我在做什麼錯?斯卡拉變種泛型遵循不同規則的Java?如何在不實際發生編譯錯誤的情況下調用一個調用Collections.sort
方法?
旁註:
不,我真的不問我怎麼能進行排序Scala中的一個列表。我知道Scala擁有自己的一套集合,排序函數和用於比較對象的不同方法(如Ordered
和Ordering
特徵)。我的問題涉及泛型方法的一般問題以及從Java到Scala的泛型翻譯。
對啊,我現在看到了錯誤!即使在Java中,客戶端代碼也需要是「集合」。 sort(list,comparator)',而不是'Collections。
另外,關於分割參數列表的好消息,我並不知道!你還可以詳細說明「Comparable」列表的版本嗎? – Natix 2013-05-08 00:13:15
@Natix查看更新的答案。 – gzm0 2013-05-08 01:20:25