在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