Коллекции, такие как List
, обычно "повторяются" с использованием map/foreach
методов более высокого порядка, однако причина, по которой мы не можем вызывать их напрямую на a
, заключается в том, что компилятор считает, что тип a
равен Any
как мы явно указали аннотацию типа a: Any
.
var a: Any = List(1,2,3,4,5,6,7,8,9,0)
| |
compile-time type runtime class
Any
не предоставляет API map/foreach
, поэтому лучшее, что мы можем сделать, это выполнить приведение во время выполнения ссылки a
к классу List[_]
, как это
if (a.isInstanceOf[List[_]]) a.asInstanceOf[List[_]].foreach(println) else ???
, который может быть эквивалентно засахарен с использованием сопоставления с образцом
a match {
case value: List[_] => value.foreach(println)
case _ => ???
}
В качестве дополнительного примечания, из-за стирания типа мы можем проверить только класс "верхнего уровня" List
и не, например, List[Int]
, следовательно, a.isInstanceOf[List[Int]]
немного вводит в заблуждение, поэтому я предпочитаю выражать его a.isInstanceOf[List[_]]
.