6

map があるとしますm: Map[Any, Int]。ここで、エントリのみを取得して、それらのエントリで新しいマップを作成し(String, Int)たいと思います。mm1: Map[String, Int]

私は次のことをしようとしています:

val m1: Map[String, Int] = m collect {case e:(String, Int) => e}

動作しているようですが、警告が表示されます: non variable type-argument String in type pattern (String, Int) is unchecked because it is removed by erasure .

どうすれば警告を取り除くことができますか?

4

3 に答える 3

9

あなたはおそらく欲しい:

val m1: Map[String, Int] = m collect {case (k:String, v:Int) => k->v}
于 2012-04-24T13:46:32.387 に答える
3

(参考までに。あなたが欲しいのはvirtualeyesの答えです。)

val m1: Map[String, Int] = m flatMap { e =>
  e._1 match {
    case e1: String => Some(e1 -> e._2)
    case _ => None
  }
}
于 2012-04-24T13:46:48.577 に答える
2

慎重にテストすると、ソリューションが (String,Int) 型のエントリだけでなく、マップ内のすべてのものと実際に一致することが示されます。コンパイラからの警告は、一致の型が実行時に破棄されることを示しているため、コードは実際には次のようなことを行っています。

val m1: Map[String, Int] = m collect {case e:Tuple2[Any,Any] => e.asInstanceOf[Tuple2[String,Int]]}

また、 asInstanceOf 呼び出しは Tuple2 にキャストするだけであり、(String,Int) ビットは消去のために再び失われるため、爆発しません。ただし、結果に対して反復しようとすると、厄介な失敗が発生します...

REPLでこれを試してください

  val m:Map[String,Int] = Map("2" -> 3, 3 -> 4, "6" -> 10) collect {case e:(String, Int) => e}
  // Oops, thought we would get '2'
  m size 
  // Nothing wrong with this code except m contains some
  // hidden nasties which causes us to blow up
  for ((s:String, i:Int) <- m) yield s.length + i 

`

于 2012-04-24T19:50:59.313 に答える