【发布时间】:2015-12-09 21:40:42
【问题描述】:
给定以下代码:
/**
* Created by danap on 12/8/15.
*/
object ImplicitTest {
trait EC {
override def toString : String = s"EC"
}
trait DEC extends EC {
def sub : EC
override def toString : String = s"DEC - $sub"
}
def usesEC(implicit ec : EC) = ec.toString
class B(implicit val dec: DEC) {
def whichEC = usesEC
}
class C(implicit val dec: DEC) {
implicit val _ec = dec.sub
def whichEC = usesEC
def whichECExplicit = usesEC(_ec)
}
def main(args:Array[String]): Unit = {
implicit val dec : DEC = new DEC {
val sub = new EC {}
}
val b = new B
val c = new C
println(s"b class = ${b.whichEC}")
println(s"c class = ${c.whichEC}")
println(s"c class = ${c.whichECExplicit}")
}
}
scala 2.11 的输出是:
b class = DEC - EC
c class = DEC - EC
c class = EC
我希望它是:
b class = DEC - EC
c class = EC
c class = EC
因为隐式 val _ec 被声明为“更接近”whichEC 中对 usesEC 的调用。为什么会这样?另外,我如何能够强制 _ec 在 C.whichEC 中隐式使用?
【问题讨论】:
-
在 scala 中使用隐式时的个人规则 #1:在范围内永远不要有多个相同类型,因为你永远不知道谁在覆盖谁。
标签: scala