2017-11-16 3 views
0

스칼라의 수수께끼에 나오는 코드에서 TestAlarmHandler이 더 구체적이기 때문에 암시 적으로 충돌이없는 것으로 보입니다. 나는 설명을 이해하지 못했다. TestAlarmHandlerDefaultAlarmHandler보다 구체적 인 이유는 무엇입니까? TESTMODE이 OperationMode의 서브 클래스, 그리고 스칼라는 TESTMODE의 범위 implicits에 대한 첫번째보기에 있습니다 만 발견되지 않는 경우는이 계층 구조에서 조회하기 때문이다우선 순위가 낮고 우선 순위가 높은 스칼라 문자

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

TestAlarmHandlerTestAlarmHandlerOperatingModeDefaultAlarmHandler을 정의하는 익명 클래스에 정의되어 있기 때문에 DefaultAlaramHandler보다 구체적입니다.


공식적으로 the Scala Language Specification 하나 개 이상의 자격이 인수가 발견되면 다음과 같이 (그들이 import TestMode._ 수입 되었기 때문에 모두 TestAlarmHandlerDefaultAlarmHandler 자격이 있음을 참고), 사건을 처리하는 방법을 지정합니다

암시 적 매개 변수의 유형과 일치하는 여러 가지 적합한 인수가있는 경우 가장 정적 인 인수가 정적 오버로드 해결 규칙을 사용하여 선택됩니다.

상대 중량 대안 B 위에 대안 A의 숫자이다

6.26.3 Overloading Resolution상대 중량의 개념의 관점에서 구체적 인 개념을 정의 0에서 2까지의 합계는

  • 1 A가 B와 같은 경우 0, se 및
  • A가 B를 정의하는 클래스 또는 객체에서 파생 된 클래스 또는 객체에 정의 된 경우 1, 그렇지 않으면 0입니다.

그 위에 TestAlarmHandlerDefaultAlarmHandlerTestAlarmHandlerDefaultAlarmHandler를 형성 OperatingMode 클래스에서 파생 익명 클래스 정의되어 0 주 동안 DefaultAlarmHandler 위에 TestAlarmHandler의 상대 중량은 1이다. 첫 번째 규칙은 메서드 오버로드를 해결할 때 고려해야 할 사항이지만 여기서는 관련이 없습니다. 이상에서 B의 상대적인 중량 A. 위에 B의 상대적인 중량보다 큰 경우

대안 A는

TestAlarmHandlerDefaultAlaramHandler 때문에보다 명확한 대안 B보다구체적이고 DefaultAlarmHandler 이상의 상대 무게 TestAlarmHandler은 역의 것보다 큽니다.

0

.

관련 문제