2014-04-01 50 views
6

說我定義以下的Java接口的Java方法:覆蓋期望一個雙陣列

public interface A 
{ 
    public Double[] x(); 
} 

,然後嘗試實現它在斯卡拉如下:

class B extends A { 
    val v: Array[Double] = Array(2.3, 6.7) 
    override def x() = v 
} 

編譯器給我的以下錯誤:

type mismatch; 
[error] found : Array[scala.Double] 
[error] required: Array[java.lang.Double] 
[error]  override def x() = v 

有人可以告訴我自動轉換此數組的推薦方法嗎?

感謝 德

+0

數組是否足夠大並且訪問性能足以成爲問題?此外,您的評論很重要 - 您必須使用「純粹Scala」。 –

回答

6

您無法自動轉換。問題在於Java中的Double意味着類別java.lang.Double(而在Scala中,它意味着scala.Double與Java中的double大部分相同),因此重寫方法具有以返回Array[java.lang.Double]。如果你有一個Array[Double],您可以使用map其轉換:

val v: Array[Double] = ... 
val v1 = v.map(java.lang.Double.valueOf(_)) // valueOf converts Double into java.lang.Double 

可以進行這種轉換隱:

implicit def wrapDoubleArray(arr: Array[Double]): Array[java.lang.Double] = 
    arr.map(java.lang.Double.valueOf(_)) 

但這在大多數情況下是一個壞主意。

+0

爲什麼隱式轉換通常是一個壞主意? – user79074

+0

1.您可能最終不得不爲其他原始包裝類型(即java.lang.Integer,java.lang.Long等)的數組添加類似的轉換,列表「,」序列「,」地圖「等)。 –

+0

2.此轉換不是微不足道的(它必須實際創建新數組並填充它)並使其隱含隱藏成本。 –

1

這能否幫助?

class B extends A { 
    val v: Array[java.lang.Double] = Array(2.3D, 6.7D) 
    override def x() = v 
} 
+0

不要害怕,v應該是一個純粹的scala類型。 – user79074

2

如果v類型必須是Array[scala.Double],那麼也許你應該考慮在重寫的方法執行自己的轉換:

class B extends A { 
    val v: Array[Double] = Array(2.3, 6.7) 

    override def x(): Array[java.lang.Double] = { 
    v map { java.lang.Double.valueOf(_) } 
    } 
}