Scala-迭代包含List()的任何变量

Scala-迭代包含List()的任何变量,scala,scala-collections,Scala,Scala Collections,我想迭代变量a。当它打印时 scala > var a : Any = List(1,2,3,4,5,6,7,8,9,0) 只需使用模式匹配: 1 2 3 4 5 6 7 8 9 0 注意:@IvanStanislavciuc巧妙地注意到,有一个警告: 警告:类型模式列表[Int]中的非变量类型参数Int未选中列表[Int]的基础,因为它已通过擦除消除 一, 这是因为类型擦除,但列表需要一个类型参数,所以您可以传递Any而不是Int。只需使用模式匹配: 1 2 3 4

我想迭代变量a。当它打印时

scala > 
       var a : Any = List(1,2,3,4,5,6,7,8,9,0)

只需使用模式匹配:

1
2
3
4
5
6
7
8
9
0
注意:@IvanStanislavciuc巧妙地注意到,有一个警告:

警告:类型模式列表[Int]中的非变量类型参数Int未选中列表[Int]的基础,因为它已通过擦除消除 一,


这是因为类型擦除,但列表需要一个类型参数,所以您可以传递Any而不是Int。

只需使用模式匹配:

1
2
3
4
5
6
7
8
9
0
注意:@IvanStanislavciuc巧妙地注意到,有一个警告:

警告:类型模式列表[Int]中的非变量类型参数Int未选中列表[Int]的基础,因为它已通过擦除消除 一,

这是因为类型擦除,但List需要一个类型参数,因此您可以传递Any而不是Int。

诸如List之类的集合通常使用map/foreach高阶方法进行迭代,然而,我们不能直接在上调用它们的原因是,编译器认为a的类型是Any,因为我们显式指定了类型注释a:Any

Any不提供map/foreach API,因此我们能做的最好的事情就是像这样执行对类列表的引用的运行时强制转换

可以使用模式匹配对其进行等效糖化

if (a.isInstanceOf[List[_]]) a.asInstanceOf[List[_]].foreach(println) else ???
作为补充说明,由于类型擦除,我们只能检查顶级类列表,而不能检查,例如,List[Int],因此a.isInstanceOf[List[Int]]有点误导,所以我更倾向于将其表示为a.isInstanceOf[List[\u]]

像List这样的集合通常使用map/foreach高阶方法进行迭代,但是我们不能直接在a上调用它们的原因是编译器认为a的类型是Any,因为我们显式指定了类型注释a:Any

Any不提供map/foreach API,因此我们能做的最好的事情就是像这样执行对类列表的引用的运行时强制转换

可以使用模式匹配对其进行等效糖化

if (a.isInstanceOf[List[_]]) a.asInstanceOf[List[_]].foreach(println) else ???

作为补充说明,由于类型擦除,我们只能检查顶级类列表,而不能检查,例如,List[Int],因此a.isInstanceOf[List[Int]]有点误导,所以我更倾向于将其表示为a.isInstanceOf[List[\u]]

值得一提的是,由于删除了Int@IvanStanislavciuc接得好,我在回答中加上了,谢谢!值得一提的是,由于删除了Int@IvanStanislavciuc接得好,我在回答中加上了,谢谢!顶级类不是类型。模式匹配发生在运行时,类型不存在。模式匹配发生在运行时,类型不存在。在@LuisMiguelMejíaSuárez注释上展开,实际上,我更喜欢这个注释:一旦你有了Any,你就失去了使用Scala的唯一理由,Scala是它强大的类型系统。你为什么一开始就有一本书?这是一种必须解决的代码气味,而不是解决方法。一旦你有了Any,你就失去了使用Scala的唯一理由,Scala是它强大的类型系统。你为什么一开始就有一本书?这是一种必须解决的代码气味,而不是解决方法。
a match {
  case value: List[_] => value.foreach(println)
  case _ => ???
}