Чем должен быть ограничен тип, прежде чем ему может быть присвоено значение «ноль»? - PullRequest
3 голосов
/ 13 декабря 2010
trait Link[This] {
    var next:This = null
}

дает "несоответствие типов; найдено: Null (null) обязательно: это"

Так что, вероятно, мне нужно сообщить контролеру типов, что это будет тип, которому можно присвоить значение NULL.Как мне это сделать?

(Если есть сайт, который я должен прочитать в первую очередь, прежде чем задавать подобные вопросы, пожалуйста, укажите мне на него. В настоящее время я на полпути к препринту 2-й редакции программированияВ Скале)

Ответы [ 3 ]

8 голосов
/ 13 декабря 2010

Вы должны ограничить This, чтобы быть суперклассом Null - это способ сообщить компилятору, что null является допустимым значением для этого типа.(На самом деле, размышления о Any, AnyRef и AnyVal только запутывают проблему - просто спросите у компилятора, что вы хотите!)

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

Однако я бы посоветовал вам избегать использованияnull, вы можете использовать Option[This] и влиять на None - такая конструкция позволит вам использовать сопоставление с шаблоном, и это очень убедительное утверждение, что клиенты, использующие это поле, могут ожидать, что оно, возможно, не будет иметь значения.

trait Link[This] {
  var next:Option[This] = None
}
0 голосов
/ 13 декабря 2010

Моя первая мысль, которая не сработала. Я не уверен почему.

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 голосов
/ 13 декабря 2010
trait Link {
  var next:This = null
}

Это должно работать.Есть ли конкретная причина, по которой вам нужно параметризовать черту с типом?

...