스칼라는 다중 상속을 지원하지 않는다고 말하면 메소드 구현을 여러 번 상속하는 것을 말합니다. 물론 클래스에서 여러 인터페이스 / 특성을 구현할 수 있으며 동일한 메소드를 정의 할 수도 있지만 특성 선형화로 인해 서로 다른 구현간에 충돌이 발생하지 않습니다.
당신은 클래스가있는 경우 일반적으로 C1
방법과 f()
과 수업 C2
방법과 또한 f()
다중 상속 수단을 다음을, 당신은 어떻게 든 모두 구현을 상속 할 수 있습니다 f()
. 이것은 여러 문제를 야기 할 수 있으며, 스칼라는 하나의 클래스에서만 상속하고 여러 특성의 경우 특성의 순서에 따라 하나의 구현을 선택하여 해결할 수 있습니다.
에 관해서는 Nothing
아무것도 정의 된 속성이나 방법이 없기 때문에 일, 정말 간단합니다. 따라서 상속 충돌이 발생하지 않습니다. 그러나 나는 당신의 놀람의 대부분이 다중 상속에 대한 다른 이해에서 비롯된 것으로 가정합니다.
특성 선형화가 상속의 모호성을 효과적으로 제거하고 다중 특성에서 상속 을 다중 상속 으로 간주하지 않는다는 것을 이해 하면 괜찮을 것입니다.
이것이 어떻게 실현되는지에 관해서 : 컴파일러는 결국 이것을 책임집니다. 스칼라 언어 사양 섹션 3.5.2 적합성을 참조하십시오 .
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
즉, 컴파일러를 올바르게 구현하려면 Nothing
사양에 따라 모든 것을 하위 유형으로 처리 해야합니다. 명백한 이유로, Nothing
시스템에로드 된 모든 클래스에서 확장되도록 정의 된 것은 아니지만 Nothing
하위 유형 으로 정의하는 관련성은 하위 유형 지정과 관련된 모든 위치로 제한됩니다.
여기서 중요한 점은 type의 인스턴스가 없다는 Nothing
것이므로 처리는 형식 검사로 엄격하게 제한됩니다. 이는 모두 컴파일러 영역에 있습니다.