覆盖需要双数组的java方法

时间:2014-04-01 16:23:15

标签: 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]  required: Array[java.lang.Double]
[error]     override def x() = v

有人可以告诉我自动转换此数组的推荐方法吗?

由于 DES

3 个答案:

答案 0 :(得分: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(_))

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

答案 1 :(得分: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(_) }
  }
}

答案 2 :(得分:1)

这会有帮助吗?

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