Se il tipo di Niente è in fondo alla gerarchia di classe, perché non posso chiamare qualsiasi metodo concepibile su di esso?

StackOverflow https://stackoverflow.com/questions/1728541

  •  19-09-2019
  •  | 
  •  

Domanda

Il tipo di scala Nothing rappresenta (se ho capito bene) nella parte inferiore della gerarchia dei tipi, indicata anche con il simbolo ⊥. Cioè, Nothing è un sottotipo di un dato tipo. Il requisito per un tipo Nothing è spiegato bene da James Iry per quelli di noi senza un background teorico nella teoria dei tipi!

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 Nulla, ma il motivo per cui non fa il seguente compilazione?

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? Si noti 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) 
}
È stato utile?

Soluzione

Mentre Nothing è un sottotipo di tutto, non si ereditare qualsiasi metodo ad eccezione di quelli in Any. Questo perché Nothing è più orientata verso la fine funzionale della lingua. E 'necessario per cose come Option e List, ma solo come un Tipo , non come una classe.

La distinzione qui è un po 'strano per chi proviene da un background orientato agli oggetti, ma il fatto è che subtyping come concetto è molto diverso da OOP. Certo, orientato agli oggetti implica davvero subtyping in qualche forma, ma il contrario non è vero. Benjamin Pierce di Tipi e linguaggi di programmazione fa un buon lavoro di presentare la lingua F_ < (pronunciato "F sub"), che serve come un esempio minimale di una lingua con sottotipo (ma non OO).

Ora, con tutto ciò che ha detto, io sono d'accordo che il fatto che Nothing è immune dalle normali regole di ereditarietà sembra un po 'incoerente. Tuttavia, da un punto di vista teorico, ha perfettamente senso.

Altri suggerimenti

Suppongo Nothing poteva accettare qualsiasi metodo, ed eseguire un'operazione di serie su tutti loro (un'eccezione). Non sarebbe molto utile, però.

Con la presentazione di un errore di compilazione, il compilatore avverte il programmatore che un tipo che molto probabilmente non voleva, Nothing, ma ho dedotto in qualche modo ad un certo punto del codice.

È possibile chiamare toString sulla variabile Nothing a causa di esso s defintion:
final trait Nothing extends Any
E toString è membro Any. Penso Nothing Scala compilatore di trattare in soli limiti di tipo e lo tratta come qualsiasi altra caratteristica su tutto i casi. Lasciando richiamare qualsiasi metodo su variabili con il tipo di Nothing sarà molto strano credo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top