scala.collection.immutable.Vector无法强制转换为

问题描述 投票:0回答:1

我很困惑为什么我不能从以下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)
scala vector functional-programming classcastexception immutable-collections
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

© www.soinside.com 2019 - 2024. All rights reserved.