2016-03-04 72 views
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) 
} 

但是,我認爲我打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

問題的答案就在你引用的bug中:「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。這本身並不是bug,只是沒有足夠的明確的錯誤信息。 – Teliatko

+1

@pathikrit無法爲每個定義的Array [Int]工作。您正在調用通用Java方法,該方法在Java中仍然是泛型的,即僅用於Object子類,這在Java中顯然不是int。在Scala方面,Java約束被解釋爲AnyRef的子類,而AnyRef〜= Object,Scala Int不是。搜索專門的註釋以爲Int提供特殊情況。見http://www.scala-notes.org/2011/04/specializing-for-primitive-types/ – Teliatko