【发布时间】:2013-05-02 01:46:58
【问题描述】:
在java.util.Collections 类中,我们有sort 方法的两种变体,一种采用具有对应Comparator 的任意对象列表:
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)
我在想如何将这种带有有界通配符的方法签名转换为 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] 注意:Number <: object java trait list e>
实际上,我发现直接调用唯一的 Java 方法甚至是不可能的,因为它会失败并出现相同类型的错误。
Collections.sort[Object](list, comparator)
至于具有可比列表的版本,我提出了以下声明:
def sort[T <: Comparable[_ >: T]](list: List[T]) { ??? }
但这根本不起作用:
涉及类型 T 的非法循环引用
我做错了什么? Scala 变体泛型是否遵循与 Java 不同的规则?如何调用Collections.sort 方法而不实际出现编译错误?
旁注:
不,我并不是在问如何在 Scala 中对列表进行排序。我知道 Scala 有自己的集合、排序函数和比较对象的不同方法(例如 Ordered 和 Ordering 特征)。我的问题涉及泛型方法的一般问题以及泛型从 Java 到 Scala 的翻译。
【问题讨论】: