Si le type de Rien ne se trouve au bas de la hiérarchie des classes, pourquoi ne puis-je appeler une méthode envisageable à ce sujet?

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

  •  19-09-2019
  •  | 
  •  

Question

Le type de scala Nothing représente (si je comprends bien) le fond de la hiérarchie de type, également désigné par le symbole ⊥. Autrement dit, Nothing est un sous-type de tout type donné. L'exigence d'un type de Nothing est bien expliqué par James Iry pour ceux d'entre nous sans arrière-plan théorique en théorie de type!

Alors ma question est, si Nothing est un sous-type de chaque type, pourquoi je peux pas appeler les méthodes de tout type sur Nothing? De toute évidence, je ne peux rien instancier mais pourquoi ne pas ce qui suit la compilation?

var n: Nothing = _

def main(args: Array[String]) {
  println(n.length) //compile error: value length is not a member of Nothing
}

Mais, comme Nothing est un sous-type de String cela devrait être OK? Notez que ce qui suit compile très bien!

var n: Nothing = _

def foo(s: String) : Int =  s.length

def main(args: Array[String]) {
  println(foo(n))
}

tout comme:

def main(args: Array[String]) {
  println(n.asInstanceOf[String].length) 
}
Était-ce utile?

La solution

Alors que Nothing est un sous-type de tout, il ne Hériter toute méthode, sauf pour ceux Any. En effet, Nothing est plus orientée vers la fin fonctionnelle de la langue. Il est nécessaire pour des choses comme Option et List, mais seulement comme un type , non pas comme une classe.

La distinction est ici un peu bizarre pour ceux qui viennent d'un milieu orienté objet, mais le fait est que le sous-typage en tant que concept est très distinct de la POO. Certes, orienté objet implique vraiment sous-typage sous une certaine forme, mais l'inverse est pas vrai. Benjamin Pierce Types et langages de programmation ne un bon travail de présenter la langue F_ < (prononcez « F sous »), qui sert d'exemple minimal d'une langue avec sous-typage (mais pas OO).

Maintenant, avec tout ce que dit, je suis d'accord que le fait que Nothing est à l'abri des règles de succession normale ne semble un peu incohérent. Cependant, d'un point de vue théorique, il est parfaitement logique.

Autres conseils

Je suppose que Nothing pourrait accepter toute méthode, et effectuer une opération standard sur tous (lancer une exception). Ce ne serait pas très utile, cependant.

En présentant une erreur de compilation, le compilateur avertit le programmeur qu'un type le plus probable qu'il ne voulait pas, Nothing, se sont en quelque sorte conclure à un certain point dans le code.

Vous pouvez appeler toString sur la variable Nothing à cause de cela est défintion:
final trait Nothing extends Any
Et toString est membre de Any. Je pense que Nothing de scala traiter du compilateur dans les limites de type seulement et traite comme tout autre trait de partout cas. Laisser invoquer une méthode sur la variable avec le type de Nothing sera très étrange, je pense.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top