假设我定义了以下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
答案 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
}