重写需要双数组的java方法

重写需要双数组的java方法,java,scala,Java,Scala,假设我定义以下java接口: public interface A { public Double[] x(); } 然后尝试在scala中实现它,如下所示: 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] requi

假设我定义以下java接口:

public interface A
{
  public Double[] x();
}
然后尝试在scala中实现它,如下所示:

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
有人能告诉我自动转换此阵列的推荐方法吗

谢谢 Des

这有帮助吗

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

如果<代码> V< /代码>必须是代码>数组[Scala.Budi] ,那么也许您应该考虑在重写方法中执行转换:

B类扩展了A类{
valv:Array[Double]=数组(2.3,6.7)
重写def x():数组[java.lang.Double]={
v映射{java.lang.Double.valueOf()}
}
}

您无法自动转换它。问题是Java中的
Double
表示类
Java.lang.Double
(而在Scala中它表示
Scala.Double
,这与Java中的
Double
基本相同),因此重写方法必须返回
数组[Java.lang.Double]
。如果您有一个
数组[Double]
,则可以使用
映射将其转换为:

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(_))

但在大多数情况下,这是一个坏主意。

恐怕不行,v应该是纯scala类型。数组是否足够大,访问是否足够多,性能是否值得关注?此外,您下面的评论很重要-您“必须”使用“纯Scala”。为什么隐式转换通常是个坏主意。对于
数组
列表
Seq
映射
等)以外的类型,您可能最终不得不为其他原始包装类型的数组添加类似的转换。这种转换并不简单(它必须实际创建新数组并填充它),而隐式转换隐藏了成本。如果其中一个阵列发生更改,则不会影响另一个阵列。由于它们看起来像一个阵列,这可能会让用户感到惊讶。