0

假设以下设置:

trait A[L] { def op(l1:L, l2:L): L }
trait E[L] { def op(l:L): L }

implicit def some2E[L:A](self:L) =  new E[L] { def op(other:L) =      
  implicitly[A[L]].op(self,other) }

有没有办法在适当的隐式上下文中直接扩展m op n为,使用宏或至少避免额外的对象创建?a.op(m,n)aA

4

1 回答 1

0

如果将隐式参数移动到op方法中,则可以使用值类来防止创建额外的对象:

implicit class some2E[L](val self: L) extends AnyVal {
 def op(other: L)(implicit x: A[L]) = x.op(self, other)
}

Hotspot 可能会内联对opin 定义的调用some2E,因此您最终会得到a.op(m, n).

于 2014-06-03T20:12:49.367 回答