3

我在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

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

4

3 回答 3

1

getIntinSpecializedClass不会覆盖 in 中的方法GeneralClass。为了能够覆盖,函数参数SpecializedClass应该是逆变的,返回类型应该是协变的。在你的情况下不是。

因此,除非您有一些将类型和返回类型作为的东西getInt,否则它不会覆盖它。SpecializedClassT :> java.lang.DoubleT <: java.lang.Integer

对于您的问题,实际上我认为不需要像 Scala 编译器那样将 Java double 隐式转换为 Scala Double 的方法。

于 2013-06-26T12:53:53.390 回答
1

尝试

override def getInt(d: Double): Integer = {
   return Integer.valueOf(d.intValue()); // explicit boxing
}
于 2013-06-26T12:19:35.833 回答
1

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

因此,一种可能性是删除override.

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

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

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

于 2013-06-26T12:47:28.833 回答