2015-01-08 2 views
-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-мя кортежа.

ответ

1

Типы элементов - это только параметры типа Tuple2.

Но вы можете:

scala> (("hi",42): Any) match { case (_: String, _: Int) => } 
+0

спасибо, Som-snytt. Поэтому, когда я пытаюсь сопоставить соответствие напрямую с '_ :(String, Int)', почему код даже компилируется? –

+0

Это проверяет экземпляр Tuple2 [String, Int], который стирается, как List [Int]. Ответ - экстрактор Tuple2, за которым следуют instanceof String и Int для частей. (На самом деле он достаточно умен, чтобы просто экземпляр Tuple2.) –

+0

интересный. так почему он стирается, как List [Int] '? –