我在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
任何人都可以解释一下,并指出一个优雅的解决方案吗?
答案 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。