1

给定

def add(x: Int, y: Int): Int = x + y

val addAsMethodReference: (Int, Int) => Int = add _

trait BinaryOperator {
  def execute(x: Int, y: Int): Int
}

val addAsBinaryOperator: BinaryOperator = addAsMethodReference...?

如何addAsMethodReference在不手动BinaryOperator 实施BinaryOperator的情况下绑定?

Java 8 SAM 可以正常工作。我可以在 Java 8 中使用二元运算符特征的任何地方使用方法引用。

理想情况下,我想写如下内容:

var addAsBinaryOperator: BinaryOperator = addAsMethodReference.asNewInstanceOf[BinaryOperator]

我想要这种asNewInstanceOf方法的原因是它适用于任何方法签名。我不在乎传递了多少参数。如果我必须手动实现这一点,我必须仔细匹配每个xy. 这在更大范围内容易出错。

如果一方有多个抽象方法,则规范left.asNewInstanceOf[right]将在编译时失败。right如果left侧不是与侧中的单个抽象方法签名匹配的功能类型right,它将在编译时失败。right侧面不需要是特征,它可以是具有单个抽象方法的抽象类。

4

2 回答 2

2

好吧,你可以进行隐式转换

implicit def myConversion(f: (Int, Int) ⇒ Int): BinaryOperator = new BinaryOperator {
    def execute(x: Int, y: Int): Int = f(x, y)
  }

如果它在范围内,你可以这样做

val addAsBinaryOperator: BinaryOperator = addAsMethodReference

对于任何返回整数的整数二进制函数。虽然也许这也归类为“手工实现”。我看不到编译器神奇地意识到您希望将函数解释为具有某些特定结构的用户创建特征的实例的方式。

于 2015-03-12T00:21:30.117 回答
0

新答案:

这可以满足您的需求。它动态创建一个BinaryOperator对象,其execute方法绑定到addAsMethodReference

def add(x: Int, y: Int): Int = x + y

val addAsMethodReference: (Int, Int) => Int = add _

trait BinaryOperator {
  def execute(x: Int, y: Int): Int
}

val addAsBinaryOperator: BinaryOperator = 
    new BinaryOperator{ def execute(x: Int, y: Int): Int = addAsMethodReference(x,y) }

旧答案

这是你想要的吗?

implicit class EnhancedBinaryOperator(val self: BinaryOperator) extends AnyVal {
  def addAsMethodReference(a: Int, b: Int) = a + b
}

val o: BinaryOperator = ???    // anything here
o.addAsMethodReference(1,2)    // addAsMethodReference is now on BinaryOperator
于 2015-03-11T23:57:43.643 回答