假设以下设置:
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)
的上下文中使用宏直接展开a
到A
,或者至少避免使用其他对象创建
答案 0 :(得分:0)
如果将隐式参数移动到op
方法,则可以使用值类来阻止创建其他对象:
implicit class some2E[L](val self: L) extends AnyVal {
def op(other: L)(implicit x: A[L]) = x.op(self, other)
}
Hotspot可能会内联对op
中定义的some2E
的调用,因此您最终会得到a.op(m, n)
。