Вы можете переписать свой пример следующим образом:
class Example {
val Tuple2(x, y): Tuple2[Int, Int] = Tuple2(1, 2)
}
Это сопоставление с шаблоном на самом деле состоит из 2 совпадений - теперь оно говорит: возьмите правый объект типа Tuple2[Int, Int]
и вызовите метод unapply[Int, Int]
на сопутствующем объекте Tuple2
.Затем unapply[Int, Int]
проверит, что объект действительно имеет тип Tuple2
, и его результирующее значение будет использовано для привязки значений к переменным x
и y
.
После этого совпадение с шаблономсодержит : Tuple2[Int, Int]
, поэтому он пытается выполнить динамическую проверку isInstanceOf[Tuple2[Int, Int]]
, чтобы определить, имеет ли объект дополнительно тип Tuple2[Int, Int]
.Однако информация об универсальном типе стирается во время выполнения, поэтому компилятор предупреждает, что он на самом деле не может создать код, который проверяет, что объект создан для параметров типа [Int, Int]
.
Таким же образом, в следующем сопоставлении с образцом:
val a: AnyRef = (1, 2)
a match {
case t2: Tuple[Int, Int] =>
}
Вы получите аналогичное предупреждение.