스칼라에서 다른 모든 유형의 하위 유형은 어떻게 없습니까?


19

스칼라를 사용한 함수형 프로그래밍에 대한 Martin Odersky의 코스 과정을 수강하고 있으며 현재로서는 이해하지 못하는 두 가지 사항을 배웠습니다.

  1. 스칼라는 다중 상속을 지원하지 않습니다
  2. Nothing 다른 모든 유형의 하위 유형입니다

이 두 진술은 함께 살 수 없으므로 어떻게 정확하게 이루어 집니까? "다른 모든 유형의 하위 유형"의 의미는 정확히 무엇입니까

편집 1

에서 스칼라 API , Nothing로 정의됩니다 abstract final class Nothing extends Any... 그래서 어떻게 다른 클래스를 확장 할 수 있습니까?


이 페이지는 약간 도움이 될 것입니다 : artima.com/pins1ed/scalas-hierarchy.html
jhewlett

내가 볼 수있는 한 "최종의 특성은 아무 것도 확장하지 않는다" scala-lang.org/api/2.7.6/scala/Nothing.html
Den

8
유형과 클래스를 혼동하고 있습니다. 이 두 가지는 매우 다릅니다. 불행하게도, 당신이 아닌 해당 구분에 혼란, 그리고 하나 정말 불행하게도, 혼동하는 사람들 중 일부는 자바, C # 및 C ++와 같은 인기있는 언어의 설계자 될 일이. 그것이 Nothing다른 모든 클래스의 하위 클래스 라고 말하지는 않습니다 . 그것은이있는 것을 나타 하위 모든 다른 유형 .
Jörg W Mittag

1
@delnan : Java의 인터페이스는 Smalltalk의 프로토콜에서 직접 가져옵니다. 스몰 토크에서는 프로토콜 만 유형이고 클래스는 없습니다. 자바에서 인터페이스 클래스 종류가 있습니다. 그건 틀렸어요. 클래스는 유형이 아니며 인터페이스 만 있습니다. 이 모든 언어에는 유형이 있고 클래스가 아닌 것들이 있다는 사실은 관련이 없습니다. 문제는 해당 언어에서 클래스가 유형이라는 것입니다.
Jörg W Mittag 2016

1
@ JörgWMittag 그것은 다른 진술이며 매우 논쟁의 여지가 있습니다 (유해하다는 데 동의하는 경향이 있지만, 이것을 타이핑에 대한 오해로 인한 것은 아닙니다). 여기서 논의 할 필요는 없습니다.

답변:


27

서브 타이핑과 상속은 서로 다른 두 가지입니다! 모든 것을 확장Nothing 하지는 않으며 하위 유형 이며 확장 합니다.Any

사양 [§3.5.2은] 의 하위 유형-관계를 규율하는 특별한 경우가 있습니다 Nothing:

§3.5.2 적합성

  • [...]
  • 모든 값 유형
    T에 대해scala.Nothing <: T <:scala.Any
  • 모든 유형 생성자 T(유형 매개 변수 수)
    scala.Nothing <: T <: scala.Any
  • [...]

어디 <:기본적 의미 "의 하위 유형입니다."

이것이 수행되는 방법에 관해서는 : 우리는 몰라, 그것은 컴파일러의 마술과 구현 세부 사항입니다.

종종 프로그래머가 할 수없는 일을 언어가 수행합니다. 이에 대한 대응 Nothing: Scala의 Any모든 것에서 제외하고 모든 것을 상속 Any합니다. 왜 Any무언가로부터 물려받지 못 합니까? 당신은 그렇게 할 수 없습니다. 스칼라는 왜 그렇게 할 수 있습니까? 스칼라는 규칙이 아니라 Nothing모든 것의 하위 유형이되는 것은 이것의 또 다른 예일뿐입니다.


10
BTW : 이것은 nullJava의 모든 유형의 필드에 지정할 수있는 것과 동일 합니다. 왜 가능합니까? 가 null모든 클래스의 인스턴스는? 아니요, 컴파일러가 그렇게 말했기 때문에 가능합니다. 기간.
Jörg W Mittag

8
내가 이것을 백 번 공표 할 수 있다면 나는 할 것입니다. 혼란스러운 유형클래스 는 Java와 같은 언어가 우리에게 가져다 준 최악의 것들 중 하나입니다.
Jörg W Mittag

1
상속의 차이에 대한 호기심 영혼과 하위 유형 cmi.ac.in/~madhavan/courses/pl2006/lecturenotes/lecture-notes/... 그러나 나는 그것을 구입하지 않는다 - 당신이 상속하는 경우처럼 ( extends작성 자바에서, 그리고 ) 결국 하위 유형 지정을 위해 수행합니다.
greenoldman

11

스칼라는 다중 상속을 지원하지 않는다고 말하면 메소드 구현을 여러 번 상속하는 것을 말합니다. 물론 클래스에서 여러 인터페이스 / 특성을 구현할 수 있으며 동일한 메소드를 정의 할 수도 있지만 특성 선형화로 인해 서로 다른 구현간에 충돌이 발생하지 않습니다.

당신은 클래스가있는 경우 일반적으로 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것이므로 처리는 형식 검사로 엄격하게 제한됩니다. 이는 모두 컴파일러 영역에 있습니다.


2
내가 아직도 이해하지 못하는 것은 이것이 어떻게 이루어지는 지이다 ... 내 질문에 대한 편집을보십시오
vainolo

1
"아무것도 하위 유형으로 정의하는 것과의 관련성은 하위 유형과 관련이있는 모든 장소로 제한됩니다." 그걸로 무엇을 전달하고 싶습니까? X는 X와 관련이 있습니까?
phant0m
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.