trait Link[This] {
var next:This = null
}
는 "형식이 일치를, 발견 : 널 (NULL)이 필요합니다 :이"제공유형을 "null"로 지정하기 전에 유형을 제한해야합니까?
을 그래서 아마도 내가이가 null 할당 할 수있는 형태가 될 것이라는 것을 유형 검사를 말할 필요가있다. 어떻게해야합니까?
trait Link[This] {
var next:This = null
}
는 "형식이 일치를, 발견 : 널 (NULL)이 필요합니다 :이"제공유형을 "null"로 지정하기 전에 유형을 제한해야합니까?
을 그래서 아마도 내가이가 null 할당 할 수있는 형태가 될 것이라는 것을 유형 검사를 말할 필요가있다. 어떻게해야합니까?
null
이 해당 유형에 유효한 값임을 컴파일러에 알리는 방법 인 This
을 수퍼 클래스 Null
으로 제한해야합니다. (사실, 생각 약 Any
, AnyRef
및 AnyVal
만 문제를 muddles - 당신이 원하는 것을 위해 컴파일러를 물어!)
trait Link[This >: Null] {
var next:This = null
}
을하지만, 난 당신이 null
을 사용하지 않는 것이 좋습니다 것입니다 당신은 Option[This]
을 사용하고 영향을 미칠 수 None
- 그런 구조는 패턴 매칭을 사용할 수있게하며,이 필드를 사용하는 클라이언트가 값을 갖지 않을 것으로 기대하는 매우 강력한 진술입니다.
trait Link[This] {
var next:Option[This] = None
}
trait Link {
var next:This = null
}
(내가 이런 질문을하기 전에 먼저 읽어해야 사이트가 있다면, 그것을. 나는 현재 스칼라에서 프로그래밍의 2 판의 프리 프레스를 통해 파트 방법이야 날 지점하시기 바랍니다)
이렇게하면됩니다. 유형으로 특성을 매개 변수화해야하는 특별한 이유가 있습니까?
'Link' 클래스가 작성한 스 니펫만큼 복잡하다고 가정하는 특별한 이유가 있습니까? –
네, 거기에 이유가 있습니다 - 이것은 다른 클래스에 섞여 있고 그 클래스의 링크드리스트를 만들고 있습니다. –
처음 생각했는데 작동하지 않았습니다. 이유가 확실하지 않습니다. 악화가 최악에 관해서
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]
}
, 당신은 더 이상 컴파일이 특성 행 유형을 필요가 없습니다 .
그 이유는 "AnyRef 확장"과 "null을 값으로 허용"이 논리적으로 구분된다는 것입니다. JVM에서 현재 가능한 모든 유형이 구현 세부 사항을 모두 충족 시키거나 거부한다는 사실을 알 수 있습니다 . –
일부 클래스의'AnyRef'가 강제적으로 null이 될 수 없다는 아이디어가 있기 때문에 작동하지 않았습니다. 그래서 당신은'trait Link [This> : Null <: AnyRef>']가 필요합니다. 그러나'AnyVal'의 어떤 것도'Null'의 수퍼 클래스가 아니기 때문에'Link [This : : Null]'만으로 충분합니다. –
옵션에 대한 옳은 설명은 결국 그렇게 될 것입니다. 하지만 이것은 원래 Java에서 일부 코드를 리팩터링하는 단계이며, 지금은 null을 사용하는 것이 너무 많습니다. –