Il tipo scala Nothing
rappresenta (a quanto ho capito) il fondo della gerarchia di tipi, indicato anche dal simbolo ⊥. Cioè, Nothing
è un sottotipo di un dato tipo. Il requisito per un tipo Nothing
è explained well by James Iry per quelli di noi senza uno sfondo teorico nella teoria dei tipi!Se il tipo Nothing è nella parte inferiore della gerarchia di classi, perché non posso richiamare alcun metodo concepibile su di esso?
Quindi la mia domanda è, se Nothing
è un sottotipo di ogni tipo, perché non posso chiamare i metodi di qualsiasi tipo su Nothing
? Ovviamente, non posso istanziare Niente, ma perché non compila il seguente?
var n: Nothing = _
def main(args: Array[String]) {
println(n.length) //compile error: value length is not a member of Nothing
}
Sicuramente come Nothing
è un sottotipo di String
questo dovrebbe essere OK? Nota che il seguente compila bene!
var n: Nothing = _
def foo(s: String) : Int = s.length
def main(args: Array[String]) {
println(foo(n))
}
come fa:
def main(args: Array[String]) {
println(n.asInstanceOf[String].length)
}
Un'altra cosa da considerare è che in 'n.length' non c'è modo per Scala di sapere quale metodo' lunghezza' di cui stai parlando - e devi saperlo prima ancora di poter pensare se i suoi argomenti (o "questo" argomento) ha il tipo giusto. In 'pippo (n)' è già chiaro quale. – Owen