0

次の Scala コード行からコレクションを生成できない理由がわかりません。

val pairs = for( v <- vc; o <- oc) yield (v,o)

不変のベクトルを使用しているこの関数の内部にあります。

 private def recMergeVirtualAndReal(mCell: RCell, vc: Vector[Cell], oc: Vector[Cell]): Vector[Cell] = {
        var temp_oc = oc
        val pairs = for( v <- vc; o <- oc) yield (v,o)
        val newVCells =
          for((left, right) <- pairs if left contains right) yield {
            temp_oc = temp_oc.filterNot(o => o == left || o == right)
            captureVCells(left,right,mCell)
          }
        if(newVCells.nonEmpty) recMergeVirtualAndReal(mCell, recMergeVirtualCells(newVCells ++ vc), temp_oc)
        else vc
      }

スタック トレースに次のエラーが表示されます。

Exception in thread "main" java.lang.ClassCastException: scala.collection.immutable.Vector cannot be cast to game.Cell
    at model.Board$$anonfun$10.apply(Board.scala:223)
    at scala.collection.immutable.List.flatMap(List.scala:327)

私は何もキャストしようとしていないので混乱しています。型変換のない単純なステートメントです。

コンパイラが型を理解できない場合に備えて、これも試しました。

val pairs = for( v: Cell <- vc: Vector[Cell]; o: Cell <- oc: Vector[Cell]) yield (v: Cell,o: Cell)
4

1 に答える 1

3

呼び出し元のコードのどこかで安全でないキャストを行っている可能性があります。関数の引数を確認し、特に の使用を確認してくださいasInstanceOf

安全でないキャストがこの問題を引き起こす可能性がある例を次に示します。まず、 を作成しList[Int]、次にコンパイラにそれを と見なさせますList[String]

val ls = List(1).asInstanceOf[List[String]]

これは機能します。Scala コンパイラは問題なく動作し、ジェネリックは実行時にリストの要素を変数に格納しようとするまでチェックされません。

val x = ls.head  // java.lang.ClassCastException: java.base/java.lang.Integer cannot be cast to java.base/java.lang.String

おそらく、コードの別の場所で を呼び出し.asInstanceOf[Vector[Cell]]Vector[Vector[Something]]それをこの関数に渡しています。asInstanceOfあなたがそれを助けることができる場合は、決して使用しないでください。

于 2019-03-17T03:47:23.853 に答える