2010-12-13 2 views

답변

8

null이 해당 유형에 유효한 값임을 컴파일러에 알리는 방법 인 This을 수퍼 클래스 Null으로 제한해야합니다. (사실, 생각 약 Any, AnyRefAnyVal 만 문제를 muddles - 당신이 원하는 것을 위해 컴파일러를 물어!)

trait Link[This >: Null] { 
    var next:This = null 
} 

을하지만, 난 당신이 null을 사용하지 않는 것이 좋습니다 것입니다 당신은 Option[This]을 사용하고 영향을 미칠 수 None - 그런 구조는 패턴 매칭을 사용할 수있게하며,이 필드를 사용하는 클라이언트가 값을 갖지 않을 것으로 기대하는 매우 강력한 진술입니다.

trait Link[This] { 
    var next:Option[This] = None 
} 
+0

옵션에 대한 옳은 설명은 결국 그렇게 될 것입니다. 하지만 이것은 원래 Java에서 일부 코드를 리팩터링하는 단계이며, 지금은 null을 사용하는 것이 너무 많습니다. –

0
trait Link { 
    var next:This = null 
} 
(내가 이런 질문을하기 전에 먼저 읽어해야 사이트가 있다면, 그것을. 나는 현재 스칼라에서 프로그래밍의 2 판의 프리 프레스를 통해 파트 방법이야 날 지점하시기 바랍니다)

이렇게하면됩니다. 유형으로 특성을 매개 변수화해야하는 특별한 이유가 있습니까?

+0

'Link' 클래스가 작성한 스 니펫만큼 복잡하다고 가정하는 특별한 이유가 있습니까? –

+0

네, 거기에 이유가 있습니다 - 이것은 다른 클래스에 섞여 있고 그 클래스의 링크드리스트를 만들고 있습니다. –

0

처음 생각했는데 작동하지 않았습니다. 이유가 확실하지 않습니다. 악화가 최악에 관해서

trait Link[This <: AnyRef] { // Without the type bound, it's Any 
    var next: This = null 
} 

, 항상 캐스팅 : 당신이 다른 이유가 그것을 할 수도 있지만

캐스트와
trait Link[This <: AnyRef] { 
    var next: This = null.asInstanceOf[This] 
} 

, 당신은 더 이상 컴파일이 특성 행 유형을 필요가 없습니다 .

+0

그 이유는 "AnyRef 확장"과 "null을 값으로 허용"이 논리적으로 구분된다는 것입니다. JVM에서 현재 가능한 모든 유형이 구현 세부 사항을 모두 충족 시키거나 거부한다는 사실을 알 수 있습니다 . –

+1

일부 클래스의'AnyRef'가 강제적으로 null이 될 수 없다는 아이디어가 있기 때문에 작동하지 않았습니다. 그래서 당신은'trait Link [This> : Null <: AnyRef>']가 필요합니다. 그러나'AnyVal'의 어떤 것도'Null'의 수퍼 클래스가 아니기 때문에'Link [This : : Null]'만으로 충분합니다. –

관련 문제