【问题标题】:implicit conversion, override, interoperability隐式转换、覆盖、互操作性
【发布时间】:2013-06-26 20:53:53
【问题描述】:

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

谁能解释一下,也许可以指出一个优雅的解决方案?

【问题讨论】:

    标签: java scala scala-java-interop


    【解决方案1】:

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

    因此,除非您在 SpecializedClass 中有 getInt 中的某些内容,它采用类型 T :> java.lang.Double 并返回类型为 T <: java.lang.Integer,否则它不会覆盖它。

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

    【讨论】:

    【解决方案2】:

    试试

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

    【讨论】:

      【解决方案3】:

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

      所以一种可能性是删除override

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        相关资源
        最近更新 更多