2011-11-27 2 views
12

지능이 AnyRef "에를 따르지 않는"때문에, 나는 그것이 6.3 절에 Scala Reference에 따라 NullPointerException이를 포기하지 않는 이유를 모르겠습니다 :null.asInstanceOf [Int]가 NullPointerException을 던지지 않는 이유는 무엇입니까?

asInstanceOf [T]를 "널"객체 자체를 돌려줍니다 (존재하는 경우) T scala.AnyRef을 준수하고, NullPointerException이 다른

을 던졌습니다 그리고 어느 null.asInstanceOf[Double], null.asInstanceOf[Boolean], null.asInstanceOf[Char] 않습니다.

PS : 내 스칼라 라이브러리 스칼라 Null에서 버전 2.9.0.1 및 OS 윈도우 XP

+0

나는 스펙에 동의해야한다. 그것은'NullPointerException'을 throw하거나 스펙을 갱신해야합니다. – huynhjl

+5

https://issues.scala-lang.org/browse/SI-5236 – huynhjl

+0

질문에 anser가 아니지만 대신 객체를 사용할 때 type ascription을 사용할 수 있습니다 :'val x = null : String' 또는'null : java.lang.Boolean'입니다. – paradigmatic

답변

5

이다 것은 하나의 값 null이있는 유형이다. null은 값이고 Scala의 모든 값은 객체이므로 객체에 대한 메서드를 호출 할 수 있습니다.

+1

나는 당신에게 동의 할 수 없습니다. 스칼라 참조가 말한 것처럼 "null"개체의 다른 구성원에 대한 참조가 발생하면 NullPointerException이 throw됩니다. –

+3

이것이 정확히 어떻게되는지입니다. 'null.toString'는 예를 들어 NullPointerException을 발생시킵니다. 런타임시 예외가 발생합니다. Java에서는 'null'이 언어 키워드이므로 컴파일 할 수 없기 때문에이 작업을 수행 할 수 없습니다. – agilesteel

-1

실제로 huynhjl의 티켓에 표시된대로 language spec의 6.3 절을 보면 조금 놀랍습니다.

반면에 행동 (null.asInstanceOf[Int] 당신에게 0을 제공합니다) 다음과 같은 관찰과 다소 일치 : 당신은 '값을'갖고 싶어 할 때

new Array[AnyRef](3) // -> Array(null, null, null) 
new Array[Int ](3) // -> Array(0, 0, 0) 

와 같은

이 제네릭 클래스에서 유용 할 수 있습니다 특정 값을 사용할 수 없더라도 X 유형의 두 번째 관찰에서와 마찬가지로 :

class X[A] { 
    var value: A = _ 
} 

new X[Int].value // -> 0 (even if X is not specialized in A, hmmm....) 
관련 문제