2

私はこれを試しました:

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)
}

しかし、私はコンパイラのバグにぶつかっていると思います:

[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)

どうすればこれを回避できますか?

4

2 に答える 2

3

あなたの質問への答えは、あなたが引用したバグの中にあります:「Javaジェネリック配列はScala値型では使用できません」。バグが言うように、本当の問題は、エラー メッセージがあまり役に立たないことです。問題は、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)
}

AnyRefObjectは Javaに対応しますが、 AnyJava オブジェクトではない Scala 型 ( などInt) が含まれます。

于 2016-03-04T06:37:21.897 に答える
1

だから、これまで私はこれをやって回避してきました:

a.slice(from, until).sorted.copyToArray(a, from)

ただし、これは 2 つの余分なトラバーサルが必要になるため、理想的ではありません。

于 2016-03-04T05:24:04.007 に答える