【发布时间】:2019-09-15 05:13:33
【问题描述】:
假设我有以下内容:
class A {
def foo() = { println("foo") }
}
case class B(a: A)
implicit def toA(b: B) = b.a
implicit def wrapper(a: A) = new {
def bar() = a.foo()
}
那么我不能执行以下操作:
val b = B(new A())
b.bar() // cannot resolve
我需要显式调用 toA() 隐式:
toA(b).bar()
或者做
(b: A).bar()
为什么编译器不知道在应用第二个隐式包装器之前应用第一个隐式?
【问题讨论】:
-
这需要两个隐式解决方案。我猜编译器只是在一次隐式解析后放弃了——如果它更努力地尝试,编译可能需要更长的时间。此外,恕我直言,依赖于两个隐式使得代码很难推理,隐式转换本身也被认为是一种不好的做法。为什么不简单的给
B直接添加一个扩展方法foo呢? -
不幸的是,我所拥有的场景不允许对 B 进行修改 - 这就像我可以制作的示例一样简单。
-
我的意思是
implicit class BOps (val b: B) extends AnyVal { def foo(): = b.a.bar() }。
标签: scala implicit-conversion implicit