在 Scala 中为 Java 方法起别名

Alias a Java method in Scala

给定一个 Java 界面

interface Value {

  Value add(Value argument);

}

(因为 Java 不支持像 + 这样的符号作为方法名称),是否可以定义一个别名方法 + 来别名 add 这样,当 class 是从 Scala 中使用的,可以这样写

  result = value1 + value2

而不是

  result = value1.add(value2)

  result = value1 add value2

别名应自动应用于所有实现该接口的 classes。

您可以通过 implicit class 添加外部方法扩展

object ValueImplicits {

  implicit class ValueOps(val value: Value) extends AnyVal {
    def +(v: Value): Value = value.add(v)
  }

}

现在可以这样工作了

import ValueImplicits._

val v1 = new Value {}
val v2 = new Value {}
val v3 = v1 + v2

如果您可以在同一包中为接口 Value 创建伴随对象,则可以避免导入。

object Value {

  implicit class ValueOps(val value: Value) extends AnyVal {
    def +(v: Value): Value = value.add(v)
  }

}

Implicit resolution 在没有任何显式导入的情况下检查伴生对象。