scala> class A
defined class A
scala> class B
defined class B
scala> val a: A = new A
a: A = A@551510e8
scala> a match {
| case _: B => println("unlikely")
| case _ => println("no match")
| }
no match
В примере выше разве компилятора не должен говорить мне, что один из случаев никогда не может соответствовать? Немного более сложный пример недавно ловил меня, ведя к тому, что чувствовало себя подобно ненужной ошибке, которая должна была быть поймана компилятором.
Править:
Только быть более ясным о вопросе. Действительно ли это невозможно в Scala по некоторым причинам, я не вижу? (Я могу понять, использовали ли типы дженерики и вводят стирание, вызывал проблемы, но это выглядит довольно прямым.) И если это не невозможно, там законные причины, это не находится в Scala? Если не, когда это будет добавлено?;)
В настоящее время проверка полноты и избыточности выполняется только для шаблонов конструктора класса case. В принципе, компилятор может делать то же самое и для некоторых других типов шаблонов. Но в SLS должно быть указано, какие именно тесты проводятся. Это выглядит выполнимым, но нетривиальным, учитывая взаимодействие между различными классами шаблонов. Итак, вкратце, это одна из областей в Scala, которая выиграет от дальнейшего развития.
Компилятор предупреждает вас (на самом деле компиляция не выполняется), если вы используете классы вариантов:
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")