在以下来自Scala的益智游戏的代码中,似乎没有冲突的冲突,因为TestAlarmHandler
更具体。我不明白这个解释。为什么TestAlarmHandler
比DefaultAlarmHandler
更具体?
object Scanner {
trait Console { def display(item: String) }
trait AlarmHandler extends (() => Unit)
def scanItem(item: String)(implicit c: Console) {
c.display(item)
}
def hitAlarmButton()(implicit ah: AlarmHandler) { ah() }
}
class OperatingMode {
implicit val ConsoleRenderer = new Scanner.Console {
def display(item: String) { println(s"Found a ${item}") }
}
implicit val DefaultAlarmHandler = new Scanner.AlarmHandler {
def apply() { println("ALARM! ALARM!") }
}
}
object NormalMode extends OperatingMode
object TestMode extends OperatingMode {
override implicit val ConsoleRenderer = new Scanner.Console {
def display(item: String) { println("Found a detonator") }
}
implicit val TestAlarmHandler = new Scanner.AlarmHandler {
def apply() { println("Test successful. Well done!") }
}
}
import NormalMode._
scala> Scanner scanItem "knife"
Found a knife
scala> Scanner.hitAlarmButton()
ALARM! ALARM!
import TestMode._
scala> Scanner scanItem "shoe"
Found a detonator
scala> Scanner.hitAlarmButton()
Test successful. Well done!
答案 0 :(得分:1)
TestAlarmHandler
比DefaultAlaramHandler
更具体,因为TestAlarmHandler
是在匿名类中定义的,该类派生自定义OperatingMode
的类DefaultAlarmHandler
。
正式地,the Scala Language Specification指定了在找到多个符合条件的参数时如何处理案例,如下所示(请注意,TestAlarmHandler
和DefaultAlarmHandler
都符合条件,因为它们已被导入import TestMode._
):
如果有几个符合条件的参数与隐式参数的类型匹配,则将使用静态重载分辨率的规则选择最具体的参数。
第6.26.3 Overloading Resolution节根据相对权重的概念定义更具体的概念:
替代A的替代A的相对权重是从0到2的数字,定义为
的总和
- 1如果A与B一样具体,否则为0,
- 1如果A在类或对象中定义,该类或对象派生自定义B的类或对象,否则为0。
TestAlarmHandler
相对于DefaultAlarmHandler
的相对权重为1,而DefaultAlarmHandler
相对于TestAlarmHandler
的相对权重为0.请注意,TestAlarmHandler
是在匿名类中定义的它源自定义OperatingMode
的类DefaultAlarmHandler
。解决方法重载时,第一条规则值得关注,但这里不相关。
如果A对B的相对权重大于B对A的相对权重,则备选A 比其他B更具体。
TestAlarmHandler
比DefaultAlaramHandler
更具体,因为TestAlarmHandler
相对于DefaultAlarmHandler
的相对权重大于反$scope.widget = {
title: 'abc',
content: 'test'
};
。
答案 1 :(得分:0)
那是因为TestMode是OperationMode的子类,scala首先在TestMode的范围内查找implicits,并且只有在未找到它时才会在层次结构中查找。