9
scala> class A 
defined class A 

scala> class B 
defined class B 

scala> val a: A = new A 
a: A = [email protected] 

scala> a match { 
    | case _: B => println("unlikely") 
    | case _ => println("no match") 
    | } 
no match 

Dans l'exemple ci-dessus ne devrait pas le compilateur me dire que l'un des cas ne peut jamais correspondre? Un exemple un peu plus compliqué m'a récemment sorti, menant à ce qui semblait être un bogue inutile qui aurait dû être attrapé par le compilateur.Meilleur contrôle de type sur le match dans Scala

Edit:

Juste pour être plus clair sur la question. Est-ce impossible à Scala pour une raison que je ne peux pas voir? (Je peux comprendre si les types utilisaient des génériques et l'effacement de type causait des problèmes mais cela semble assez simple.) Et si ce n'est pas impossible, y a-t-il des raisons légitimes que ce n'est pas dans Scala? Sinon, quand sera-t-il ajouté? ;)

Répondre

22

Actuellement, l'exhaustivité et la redondance de contrôle sont effectuées que pour les modèles de constructeur de la classe affaire. En principe, le compilateur pourrait faire cela pour d'autres types de motifs. Mais il faudrait préciser dans le SLS quels tests sont effectués. Cela semble faisable mais non trivial, étant donné les interactions entre différentes classes de modèles. Donc, en résumé, c'est l'un des domaines de Scala qui bénéficierait de contributions supplémentaires.

+3

Incroyable! Je vais ma réponse de celui qui m'a enseigné scala et l'a aussi induit! Thx stackoverflow! – Kami

4

Le compilateur ne vous avertit (dans la compilation de fait échoue) si vous utilisez des classes de cas:

scala> case class A() 
defined class A 

scala> case class B() 
defined class B 

scala> val a = A() 
a: A = A() 

scala> a match { 
    | case A() => println("A") 
    | case B() => println("B") 
    | case _ => println("_") 
    | } 
<console>:13: error: constructor cannot be instantiated to expected type; 
found : B 
required: A 
     case B() => println("B") 
+0

Malheureusement, les classes de cas ont certaines restrictions et ne sont pas toujours adaptées. Je ne vois pas pourquoi le compilateur ne peut pas comprendre cela pour les classes normales aussi. – Dave

Questions connexes