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 

В приведенном выше примере компилятор не должен сообщать мне, что один из случаев никогда не может совпадать? Немного более сложный пример недавно привлек меня, что привело к тому, что было похоже на ненужную ошибку, которую должен был поймать компилятор.Лучшая проверка типа на матче в Scala

Edit:

Просто чтобы быть понятнее о вопросе. Разве это невозможно в Скале по какой-то причине я не вижу? (Я могу понять, используют ли типы дженерики и стирание типов, что вызывает проблемы, но это выглядит довольно прямолинейно.) И если это невозможно, есть ли законные причины, которых нет в Scala? Если нет, когда он будет добавлен? ;)

ответ

22

В настоящее время, исчерпанность и резервирование проверки делаются только для моделей конструктора случая класса. В принципе, компилятор мог бы сделать это и для некоторых других типов шаблонов. Но в SLS необходимо точно указать, какие тесты выполняются. Это выглядит выполнимым, но нетривиальным, учитывая взаимодействие между различными классами шаблонов. Итак, вкратце, это одна из областей в Скале, которая выиграла бы от дальнейших взносов.

+3

Удивительно! Я отвечу от того, кто учил меня scala и ввел его в заблуждение! Thx stackoverflow! – Kami

4

Компилятор делает предупредит вас (на самом деле компиляции не получится), если вы используете тематические классы:

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

К сожалению, классы классов имеют некоторые ограничения и не всегда подходят. Я не понимаю, почему компилятор тоже не может понять это для обычных классов. – Dave

Смежные вопросы