Class 계층 구조의 맨 아래에없는 유형이 없다면 왜 상상할 수있는 방법을 호출 할 수 없습니까?

StackOverflow https://stackoverflow.com/questions/1728541

  •  19-09-2019
  •  | 
  •  

문제

스칼라 유형 Nothing (내가 이해하는 것처럼) 유형 계층의 하단을 나타내며, 기호 ⊥로 표시됩니다. 그건, Nothing 주어진 유형의 하위 유형입니다. a Nothing 유형입니다 James Iry가 잘 설명했습니다 유형 이론에 대한 이론적 배경이없는 우리의 사람들을 위해!

그래서 제 질문은 IF입니다 Nothing 모든 유형의 하위 유형입니다. 왜 유형의 메소드를 호출 할 수없는 이유 Nothing? 분명히, 나는 아무것도 인스턴스화 할 수 없지만 왜 다음이 컴파일되지 않습니까?

var n: Nothing = _

def main(args: Array[String]) {
  println(n.length) //compile error: value length is not a member of Nothing
}

확실히 Nothing 하위 유형입니다 String 괜찮을까요? 다음은 잘 컴파일합니다!

var n: Nothing = _

def foo(s: String) : Int =  s.length

def main(args: Array[String]) {
  println(foo(n))
}

마찬가지로 :

def main(args: Array[String]) {
  println(n.asInstanceOf[String].length) 
}
도움이 되었습니까?

해결책

하는 동안 Nothing 모든 것의 하위 유형입니다 상속 안에있는 방법을 제외한 모든 방법 Any. 이 때문입니다 Nothing 언어의 기능적 끝에 더욱 장비가 있습니다. 같은 것들에 필요합니다 Option 그리고 List, 그러나 단지 a 유형, 수업이 아닙니다.

여기서 구별은 객체 지향적 배경에서 나오는 사람들에게는 약간 이상하지만, 사실은 개념으로서의 하위 유형이 OOP와 매우 다르다는 것입니다. 물론, 객체 지향은 실제로 어떤 형태로 어떤 형태로 하위 유형을 의미하지만, 그 반대는 사실이 아닙니다. 벤자민 피어스 유형 및 프로그래밍 언어 언어를 제시하는 좋은 일을합니다 에프_ ( "f sub")는 하위 유형이있는 언어의 최소 예제 역할을합니다 (oo).

이제 모든 것을 말하면서 나는 그 사실에 동의합니다. Nothing 정상적인 상속 규칙의 면역은 약간 일관되지 않은 것처럼 보입니다. 그러나 이론적 인 관점에서 볼 때 완벽한 의미가 있습니다.

다른 팁

나는 생각한다 Nothing 모든 방법을 받아들이고 모든 방법에 대한 표준 작업을 수행 할 수 있습니다 (예외를 던지기). 그래도 그다지 유용하지는 않습니다.

컴파일 오류를 제시함으로써 컴파일러는 프로그래머에게 자신이 원하지 않는 유형을 경고합니다. Nothing, 코드의 특정 시점에서 어떻게 든 유추되었습니다.

전화해도됩니다 toString ~에 Nothing 변수 정의로 인해 변수 :
final trait Nothing extends Any
그리고 Tostring은 회원입니다 Any. 스칼라 컴파일러가 취급한다고 생각합니다 Nothing 유형에서만 한 경계만으로도 모든 경우에 다른 특성처럼 취급합니다. 유형의 변수에서 모든 메소드를 호출하도록합니다 Nothing 내가 생각하는 것은 매우 이상 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top