scala.collection.immutable.Vector 无法转换为 <My Class>
scala.collection.immutable.Vector cannot be cast to <My Class>
我很困惑为什么我不能从以下 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.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)
您可能在调用代码的某处进行了不安全的转换。检查函数的参数,特别是检查 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
可能,在您的代码的其他地方,您在 Vector[Vector[Something]]
上调用 .asInstanceOf[Vector[Cell]]
,然后将其传递给此函数。如果可以,请不要使用 asInstanceOf
。
我很困惑为什么我不能从以下 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.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)
您可能在调用代码的某处进行了不安全的转换。检查函数的参数,特别是检查 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
可能,在您的代码的其他地方,您在 Vector[Vector[Something]]
上调用 .asInstanceOf[Vector[Cell]]
,然后将其传递给此函数。如果可以,请不要使用 asInstanceOf
。