重写需要双数组的java方法
假设我定义以下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
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
,映射
等)以外的类型,您可能最终不得不为其他原始包装类型的数组添加类似的转换。这种转换并不简单(它必须实际创建新数组并填充它),而隐式转换隐藏了成本。如果其中一个阵列发生更改,则不会影响另一个阵列。由于它们看起来像一个阵列,这可能会让用户感到惊讶。