1

Я хочу, чтобы избавиться от типа стирания предупреждения этого образца кода:Scala сопоставление с образцом по параметру типа

val a: Seq[Any] = Seq(1) 
a match { 
    case b: Seq[Int] => b.map(c => println(2 * c)) 
    case _ => println("Not matched") 
} 

Он собирает и работает нормально, но с предупреждением:

Предупреждение :(31, 13) аргумент типа non-variable Тип Int в типе Seq [Int] (лежащий в основе Seq [Int]) не отмечен, так как он равен , удаленным стиранием case b: Seq [Int] => b.map (c => println (2 * c)) ^

У вас есть какое-то простое решение для предотвращения стирания в этом случае?

Что есть я пытался до сих пор (accorting к this):

val a: Seq[Any] = Seq(1) 
a match { 
    case [email protected](_:Int) => b.map(c => println(2 * c)) 
    case _ => println("Not matched") 
} 

Но это не будет компилироваться, так как с теперь типа Any.

Я считаю, что есть несколько решений этой проблемы. Я соглашусь простейший.

+0

Обратите внимание, что ваш подход нарушает parametricity - https://dl.dropboxusercontent.com/u/7810909/talks/parametricity/4985cb8e6d8d9a24e32d98204526c8e3b9319e33/parametricity.pdf. –

ответ

0

Этот

case b: Seq[Int @unchecked] => b.map(c => println(2 * c)) 

избавится от предупреждения. Но это не решит основной проблемы стирания. Seq("1") будет соответствовать этому случаю.

0

У меня была такая же проблема, я в конечном итоге делает что-то вроде этого (не нашел ничего красивее):

val a: Seq[Any] = Seq(1) 
a match { 
    case b: Seq[_] => b.map(c => 
    c match { 
     case s: Int => print(2 * s) 
     case _ => print("Not matched") 
    }) 
    case _ => print("Not matched") 
} 
0

Я не уверен, что это простое решение, но я думаю, что лучше матч над типом с TypeTag сек

def matchOnList[A: TypeTag](l: List[A]) = typeOf[A] match { 
    case t if t =:= typeOf[Int] => 
     l.asInstanceOf[List[Int]].foreach(c => println(2 * c)) 
    case _ => println("Not matched") 
    } 

val a = List(1) 

matchOnList(a) 
+0

Да, этот, который я уже видел где-то, мне не нравится использование 'asInstanceOf'. – mirelon

+0

@mirelon меня тоже :), но у меня нет идеи, как избежать кастинга. –