我试过了:
implicit class ArrayExtensions[A](a: Array[A]) {
/**
* Sort a slice [from, until) of this array
*/
def sort(from: Int, until: Int)(implicit cmp: Ordering[A]) = java.util.Arrays.sort(a, from, until, cmp)
}
但是,我认为我正在点击a bug in the compiler:
[error] found : Array[A]
[error] required: Array[? with Object]
[error] Note: A >: ? with Object, but class Array is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ >: ? with Object`. (SLS 3.2.10)
[error] def sort(from: Int, until: Int)(implicit cmp: Ordering[A]) = java.util.Arrays.sort(a, from, until, cmp)
我该如何解决这个问题?
答案 0 :(得分:3)
您的问题的答案就在您引用的错误中:" Java通用数组不能与Scala值类型一起使用"。正如bug所说,真正的问题是错误信息并没有太大帮助。问题是您对A的类型没有约束,但并非所有Scala类型都可以用作Java泛型类型参数,只有引用类型可以。试试这个:
implicit class ArrayExtensions[A <: AnyRef](a: Array[A]) {
/**
* Sort a slice [from, until) of this array
*/
def sort(from: Int, until: Int)(implicit cmp: Ordering[A]) = java.util.Arrays.sort(a, from, until, cmp)
}
AnyRef
对应Java Object
,而Any
包含非Java对象的Scala类型(如Int
)。
答案 1 :(得分:1)
所以,到目前为止,我已经做到了这一点:
a.slice(from, until).sorted.copyToArray(a, from)
但是,这并不理想,因为它需要两次额外的遍历。