У меня есть фрагмент кода, который полагается на существование произвольного элемента определенного класса case для работы с полями класса. Есть некоторые options, и хотя почти каждый блог Scala рекомендует никогда не использовать null
, это не кажется ужасной идеей в программировании на уровне типов (например, этот ответ: https://stackoverflow.com/a/4443972/1650448). Однако этот код, напрямую приводящий null
к конкретному case-классу, не работает и не выдает ошибку, и мне интересно, почему.
trait V {}
case class W(x: Int) extends V
val y = null.asInstanceOf[W]
y match {
case w:W => println("null cast to W is a W")
case _ => println("null cast to W is NOT a W")
}
// prints "null cast to W is NOT a W"
y match {
case v:V => println("null cast to W is a V")
case _ => println("null cast to W is NOT a V")
}
// prints "null cast to W is NOT a V"
val z = W(1)
z match {
case w:W => println("instantiated W is a W")
case _ => println("instantiated W is NOT a W")
}
// prints "instantiated W is a W"
z match {
case v:V => println("instantiated W is a V")
case _ => println("instantiated W is NOT a V")
}
// prints "instantiated W is a V"
null
. ИспользуйтеOption
. - person Tim   schedule 12.11.2019