隐式转换,覆盖,互操作性

时间:2013-06-26 12:16:01

标签: java scala scala-java-interop

我在Java中有以下类:

public class GeneralClass {
    public Integer getInt(Double d) {
        return d.intValue();
    }
}

我想在scala中扩展这个类,例如

import scala.collection.JavaConversions._
import scala.collection.JavaConverters._

class SpecializedClass extends GeneralClass {

  override def getInt(d: Double): Int = {
    d.intValue()
  }
}

问题是scala.Double和scala.Int都没有自动转换为各自的java类型。

修改 错误消息是:

  

方法getInt不会覆盖任何内容。注意:超类的类   SpecializedClass包含以下非最终成员   getInt:def getInt(d:Double):Integer

任何人都可以解释一下,并指出一个优雅的解决方案吗?

3 个答案:

答案 0 :(得分:1)

尝试

override def getInt(d: Double): Integer = {
   return Integer.valueOf(d.intValue()); // explicit boxing
}

答案 1 :(得分:1)

它并没有真正覆盖现有方法(因为类型不同)。

所以有一种可能性就是删除override

另一方面,如果您真的想要override关键字:

override def getInt(d: java.lang.Double): java.lang.Integer = {
  d.intValue()
}

一般来说,在Java / Scala互操作性中使用原始数据类型可能很棘手:这是另一个与scala.Option一起处理原始数据类型的示例。

答案 2 :(得分:1)

getInt中的

SpecializedClass未覆盖GeneralClass中的方法。为了能够覆盖,SpecializedClass中的函数参数应该是逆变的,并且返回类型应该是共变量。在你的情况下不是。

因此,除非getInt中的SpecializedClass中包含T :> java.lang.Double类型且返回类型为T <: java.lang.Integer的内容,否则不会覆盖它。

对于你的问题,实际上我觉得不需要有这样的方法,因为Scala编译器会隐式地将Java double转换为Scala Double。