이 우리의 응용 프로그램에서 무슨 일이 일어나고 있는지의 단순화 된 코드입니다 .String은 java.lang.Boolean으로 캐스팅 될 수 없습니다.클래스 캐스트 예외 ("=="재정의)
나는 잘못된 것을하고 있지만 무엇을 이해하지 못한다는 것을 알고 있습니다.
편집
나는 변경하여 코드를 수정했습니다 :
class First { def ==(first:First)= true}
을 지금 REPL의 오류는 다음과 같습니다
error: type mismatch;
found : First(in object $iw)
required: First(in object $iw)
Second(new First) == Second(new First)
더욱 예상치 못한 나에게 :
\업데이트 두 번째 예제는 내 잘못입니다. REPL에서 클래스 First를 대화식으로 변경하여 이상한 결과를 초래했습니다. 처음부터 시작 그것은 작동합니다. 여전히 첫 번째 ...
이 설명은 물을 보유하지 않는 것처럼 보입니다. 컴파일러는 실제로 오버로드 된 메서드를 호출 할 때 반환 형식을 고려할 정도로 똑똑합니다. 이렇게하면 :'class Foo {def bar (x : Any) : Boolean = false; bar foo : Boolean = new Foo(). bar ("baz")는 제대로 작동하고'false'를 반환합니다. – Dima
@Dima 이상하게도, http://www.scala-lang.org/files/archive/spec/2.12/06-expressions.html#overloading-resolution을 올바르게 읽는다면 제대로 작동하지 않을 것입니다 : 둘 다 대안이 적용 가능하며 (매개 변수 유형에만 의존 함), 리턴 유형은 다형성 유형에 대해서만 중요합니다. 물론 규칙이 매우 복잡하기 때문에 뭔가 빠져있을 수 있습니다. –
@Dima 또한 컴파일러가 캐스트를 삽입하기 때문에 ('ClassCastException'이 없기 때문에) 캐스트를 삽입하기 때문에'first == x.first' 자체에 예상되는 유형이 없으므로 컴파일러는 그것을 사용하여 과부하를 선택할 수 없습니다. 즉, 내 설명에 따르면 당신은'val foo : Boolean = new Foo(). bar ("baz"). asInstanceOf [Boolean]'대신에 시도 할 필요가있다. –