Scala中的Java方法别名

Scala中的Java方法别名,java,scala,scala-java-interop,Java,Scala,Scala Java Interop,给定一个Java接口 interface Value { Value add(Value argument); } (由于Java不支持像+这样的符号作为方法名),是否可以将别名方法+定义为别名add,以便在使用Scala中的类时可以编写 result = value1 + value2 而不是 result = value1.add(value2) 或 别名应自动应用于实现接口的所有类。您可以通过 对象值隐式{ 隐式类ValueOps(val-value:value)扩展

给定一个Java接口

interface Value {

  Value add(Value argument);

}
(由于Java不支持像+这样的符号作为方法名),是否可以将别名方法
+
定义为别名
add
,以便在使用Scala中的类时可以编写

  result = value1 + value2
而不是

  result = value1.add(value2)


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

您可以通过

对象值隐式{
隐式类ValueOps(val-value:value)扩展了AnyVal{
def+(v:值):值=值。添加(v)
}
}
现在它可以这样工作了

import ValueImplicits._

val v1 = new Value {}
val v2 = new Value {}
val v3 = v1 + v2
如果可以在同一个包中为interface
Value
创建伴生对象,则可以避免导入

object Value {

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

}

在没有任何显式导入的情况下检查伴随对象

我本来打算在Dotty中建议使用
scala.annotation.alpha
,但这显然不起作用-它不会覆盖实际的add方法,但是当创建一个add方法和一个具有相同别名的操作符时,它会说有一个双重定义,奇怪的是,请看这个非常相似的问题:@user您不能用Scala宏注释来注释Java接口。@DmytroMitin不,但您可以注释实现这些接口的Scala类,并可能生成这些方法Companion不仅仅是一个与class/trait同名的对象,而且在同一个包中。它必须在同一范围和同一文件中。否则它只是一个同名的对象,而不是同伴。所以没有人能为Java接口创建伴生对象。
object Value {

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

}