Scala - Итерация любой переменной, которая содержит List () - PullRequest
1 голос
/ 22 апреля 2020
scala > 
       var a : Any = List(1,2,3,4,5,6,7,8,9,0)

Я хочу перебрать переменную a. как это печатать

1
2
3
4
5
6
7
8
9
0

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Коллекции, такие как 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[_]].

2 голосов
/ 22 апреля 2020

Просто используйте сопоставление с образцом:

a match {
    case l: List[Int] => l.foreach(println)
}

PS: Как ловко замечает @ IvanStanislavciu c, появляется предупреждение:

предупреждение: аргумент типа не переменной Int в шаблоне типа List [Int] (базовый элемент List [Int]) не проверяется, поскольку он удаляется при стирании 1

Это происходит из-за стирания типа, но List требуется параметр типа, поэтому Вы также можете передать Any вместо Int.

...