2016-03-04 10 views
2

Я попытался это:Сортировка массива на месте в Scala

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

Я думаю, что JVM может быть тегом. Я считаю, что Java не должен быть тегом. – mubeen

+0

В чем проблема с вызовом 'java.util.Arrays.sort' напрямую? – kostya

+0

@kostya: Я только что опубликовал ошибку компиляции, которую я получаю, когда я вызываю 'java.util.Arrays' – pathikrit

ответ

1

Итак, пока я удосужился, делая это:

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

Но это не является идеальным, поскольку это требует двух дополнительных обходов.

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

AnyRef соответствует Java Object, в то время как Any включает в себя типы Scala, которые не являются Java объекты (как Int).

+0

Спасибо! Но это не работает для 'Array [Int]' – pathikrit

+0

. Для полноты ссылки на вопрос Scala https://issues.scala-lang.org/plugins/servlet/mobile#issue/si-5783. Это не ошибка сама по себе, просто недостаточно ясного сообщения об ошибке. – Teliatko

+1

@pathikrit не может работать для Array [Int] за определение. Вы вызываете общий метод Java, который по-прежнему носит общий характер в смысле Java, т. Е. Только для подклассов Object, который, очевидно, int в Java не является. На стороне Scala ограничение Java интерпретируется как подкласс Class AnyRef, в то время как AnyRef ~ = Object, что опять же Scala Int не является. Найдите специализированную аннотацию, чтобы иметь специальный случай для Int. См. Http://www.scala-notes.org/2011/04/specializing-for-primitive-types/ – Teliatko