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 

En el ejemplo anterior, ¿no debería el compilador decirme que uno de los casos nunca puede coincidir? Un ejemplo un poco más complicado me sorprendió recientemente, lo que me llevó a lo que parecía un error innecesario que debería haber sido capturado por el compilador.Mejor tipo comprobación de coincidencia en Scala

Editar:

sólo para estar más clara sobre la cuestión. ¿Es esto imposible en Scala por alguna razón que no puedo ver? (Puedo entender si los tipos usaban genéricos y la borradura de tipo estaba causando problemas, pero esto parece bastante sencillo). ¿Y si esto no es imposible, hay razones legítimas por las que esto no está en Scala? Si no, ¿cuándo se agregará? ;)

Respuesta

22

En la actualidad, la exhaustividad y la comprobación de la redundancia se realiza solamente para los patrones de constructor de la clase caso. En principio, el compilador podría hacer esto para algunos otros tipos de patrones, también. Pero debería especificarse en el SLS exactamente qué pruebas se realizan. Esto parece factible pero no trivial, dadas las interacciones entre diferentes clases de patrones. Entonces, en resumen, esa es una de las áreas en Scala que se beneficiaría con contribuciones adicionales.

+3

¡Increíble! ¡Respondo la respuesta de quien me enseñó la Scala y la inventé también! Thx stackoverflow! – Kami

4

el compilador le advertirá (de hecho compilación falla) si utiliza clases de casos:

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

Desafortunadamente las clases de casos tienen algunas restricciones y no siempre son adecuadas. No puedo ver por qué el compilador tampoco puede resolver esto en las clases normales. – Dave

Cuestiones relacionadas