scala.collection.immutable.Vector не может быть приведен к <My Class> - PullRequest
0 голосов
/ 17 марта 2019

Я озадачен, почему не могу получить коллекцию из следующей строки кода 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)

1 Ответ

3 голосов
/ 17 марта 2019

Возможно, вы выполняете небезопасное приведение где-то в коде вызова.Проверьте аргументы своей функции и особенно проверьте использование 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, если можете помочь.

...