-2
Учитывая следующую функцию:Образец соответствия «Любой» как 2-кортеж?
scala> def foo(x: Any) = x match {
| case _: (String, Int) => "foo"
| case _ => "bar"
| }
Я получаю предупреждение следующего времени компиляции:
<console>:8: warning: non-variable type argument String in type pattern (String, Int) is unchecked since it is eliminated by erasure
case _: (String, Int) => "foo"
^
foo: (x: Any)String
Моего пониманием JVM стирание, а именно для List[T]
, является то, что во время выполнения, виртуальная машина не знает тип T
.
Пожалуйста, объясните причину вышеприведенного is unchecked since it is eliminated by erasure
для попытки сопоставления образцов по 2-мя кортежа.
спасибо, Som-snytt. Поэтому, когда я пытаюсь сопоставить соответствие напрямую с '_ :(String, Int)', почему код даже компилируется? –
Это проверяет экземпляр Tuple2 [String, Int], который стирается, как List [Int]. Ответ - экстрактор Tuple2, за которым следуют instanceof String и Int для частей. (На самом деле он достаточно умен, чтобы просто экземпляр Tuple2.) –
интересный. так почему он стирается, как List [Int] '? –