Из Спецификации языка Scala , раздел 8.1 Шаблоны, идентификатор после: должен быть тем, что упоминается как Шаблон типа, определенный в Разделе 8.2:
Типовые шаблоны состоят из типов, переменных типов и подстановочных знаков. Тип
шаблон T имеет одну из следующих форм:
...
Параметризованный тип шаблона T [a (1),. , , , a (n)], где a (i)
введите переменные шаблоны или символы подстановки _. Этот тип шаблона соответствует всем
значения, которые соответствуют T для некоторой произвольной реализации типа
переменные и подстановочные знаки. Тип границ или псевдонимов этих типов
переменные определяются, как описано в (§8.3).
...
Шаблон переменной типа - это простой идентификатор, который начинается с
строчная буква. Однако предопределенные псевдонимы примитивного типа
unit, boolean, byte, short, char, int, long, float и double не являются
классифицируется как тип переменных шаблонов.
Таким образом, синтаксически, вы не можете использовать полностью определенный класс в качестве шаблона переменной типа В ЭТОЙ ПОЗИЦИИ. Однако вы можете использовать псевдоним типа, так:
type JavaInt = java.lang.Integer
List(new java.lang.Integer(5)) match {
case y: Seq[JavaInt] => 6
case _ => 7
}
вернет 6, как и ожидалось. Проблема в том, что, как указывает Алан Берлисон, следующее также возвращает 6:
List("foobar") match {
case y: Seq[JavaInt] => 6
case _ => 7
}
потому что тип стирается. Вы можете увидеть это, запустив REPL или scalac с опцией -unchecked.