在 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 在没有任何显式导入的情况下检查伴生对象。
给定一个 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 在没有任何显式导入的情况下检查伴生对象。