Нет предупреждения об удалении типа для частичной функции с абстрактным типом

#scala #compiler-warnings #type-erasure

#scala #предупреждения компилятора #удаление типа

Вопрос:

Следующее определение не вызывает никаких предупреждений в scala 2.10.4:

 class NoWarning[T] {
  def f: PartialFunction[Any, T] = { case x: List[T] => x.head }
}
  

Однако это происходит (как и ожидалось) в scala 2.10.4, но не в 2.11.1:

 class WithWarning {
  def f[T]: PartialFunction[Any, T] = { case x: List[T] => x.head }
}
  
  1. Почему первое определение вообще не вызывает предупреждения?
  2. Почему второе определение не вызывает предупреждение в scala 2.11.1?

Комментарии:

1. Ни один из них не является типобезопасным, его легко получить ClassCastException из любого. Я думаю, что это ошибка компилятора.

Ответ №1:

Одерский объясняет разницу в сопоставлении с шаблоном в зависимости от того, относится ли параметр типа к методу или классу.

Я предполагаю, что это из-за подклассов.