Чтобы проиллюстрировать комментарий Матеуша
isInstanceOf
не запоминается
подразумевается, что мы должны были бы следовать asInstanceOf
, например,
if (list.head.isInstanceOf[List[_]]) unlist(list.head.asInstanceOf[List[_]])
Сопоставление с образцом, как продемонстрировал Тим, неявно выполняет комбинацию isInstanceOf/asInstanceOf
. Также рассмотрите связанный ответ .
Если вы не можете выполнить рефакторинг Any
, который является самым слабым типов, возможно, попытайтесь восстановить столько информации о наборе, сколько как можно раньше, возможно, примерно так:
val lists: List[List[_]] = list.collect { case xs: List[_] => xs }
val ints: List[Int] = list.collect { case i: Int => i }
val strings: List[String] = list.collect { case s: String => s }
Обратите внимание, что из-за стирания типа мы не можем легко сделать намного лучше, чем List[List[_]]
, например, следующее утверждение проходит
val list: List[Any] = List(List("woo", "hoo"), 42, "kerfuffle")
assert(list.head.isInstanceOf[List[Double]])
В этом последнем случае предупреждение компилятора сообщит вам, что type argument Double in type List[Double] (the underlying of List[Double]) is unchecked since it is eliminated by erasure
. Обычно не стоит игнорировать такие предупреждения.