2016-08-29 3 views
5

yml 구성에서로드 할 구성이 내 스칼라 빈을 만들고 있는데, 긴 속성을 지정할 지정되지 있지만 아래에 직면하고 싶습니다. 발행물. 왜 그런가?왜 스칼라 왜 Integer 수 null로 whear null로 초기화 할 수 없습니다.

startOffset: Integer = null 
scala> var endOffset: Long = null 
<console>:11: error: an expression of type Null is ineligible for implicit conversion 
    var endOffset: Long = null 
         ^` 

PS : 그래, 난 Option[Long]를 사용하지만 선명도를 원하고이 방법 아무 잘못이있을 수 있습니다.

+0

예,이 방법에 문제가있다. Null은 Java의 불행한 유산이며 원래 스칼라 코드에서 사용해서는 안됩니다. 런타임 오류가 발생했습니다. – Malvolio

답변

10

스칼라 Long은 Java에서 long과 같은 리터럴 날짜 유형입니다. Int에 대해서도 마찬가지입니다. 그러나 Integerjava.lang.Long

+0

나는 class def를 기반으로 그렇게 gueesed했다. 이것은 너무 혼란스러운 btw입니다! 이것은 의도 된 것입니까, 아니면 그냥 감독입니까? – mukh007

+0

이것은 두 가지 정책 사이의 충돌 일뿐입니다. 스칼라의 유형은 대문자이고, Int 및 Long과 같은 프리미티브조차도 있으며, java.lang의 모든 것이 기본적으로 사용 가능합니다. – Malvolio

8

IntLong 스칼라의 종류 및 기준 유형 (즉,하지 AnyRef하지 않은, AnyVal에서 파생되는 래퍼 클래스 즉 java.lang.Integer

당신이 널 긴 값을 원하는 경우에, 당신이 사용할 수있다) 따라서 null이 될 수 없습니다. 반면 Integer은 참조 유형 인 java.lang.Integer의 별칭입니다.

아니, 그것은 IntLong 내가 그것을 이해 스칼라에서 nullnull 단지 자바 호환성 (심지어 AnyRef에 대한)뿐만 아니라 Integer 같은 존재, 나쁜 일이 간주됩니다 사용, 일치, 간과 아니다.

1

스칼라에서 scala.Null 유형은 scala.AnyRef에서 상속받은 모든 참조 유형 (java.lang.Object의 별칭)의 하위 유형입니다. 그렇기 때문에 참조 유형이 예상되는 모든 곳에서 null 값 (유형은 scala.Null)을 사용할 수 있습니다.

그러나 어떤 값 유형의 하위 유형 (scala.AnyVal에서 상속되는 유형)은 아닙니다. scala.Int, scala.Long, scala.Boolean ... (Java의 기본 유형에 해당)과 같은 유형은 값 유형이므로 null 일 수 없습니다.

당신이 언급 Integer 유형에 관해서는 :이 java.lang.Object (일명, scala.AnyRef)의 하위 유형 인 java.lang.Integer, 추측 : 당신이 null을 사용할 수 있도록 그것은, 참조 형식입니다.

그것은 (the official documentation에서 해제) 스칼라 유형 계층 구조의이 그림으로 이해하는 것이 더 쉬울 것입니다 : Scala types hierarchy

관련 문제