当编译器声明它具有Any类型时,Scala会收回一个集合

时间:2014-11-11 06:59:17

标签: list scala collections types

使用Scala,我能够得到以下结果:

res56: Any = 
List(List(0.0, hello world), List(0.0, huzzah!), List(0.0, herp a erp), List(0.0, Open up), List(0.0, "WHY!! That FACE!"))

为什么Scala认为这有Any类型,为什么我只能使用asInstanceOf[List[List[Double,String]]]我也看到过Maps这种情况。我不知道还能做些什么...

感谢您的帮助!

修改:感谢您普遍接受的答案:List[(Double, String)],但我该如何到达那里?例如,如何轻松地转换为这样的类型?在过去的很多收藏中,我不得不做很多长期和奇怪的演员,有很多.toList.asInstanceOf

是否可以通过简短的方式将此表单中的某些内容转换为List[(Double,String)]

2 个答案:

答案 0 :(得分:2)

scala标准库中的集合是单态的,即List中的所有元素必须具有相同的类型。

Map没有区别:它有一个一个类型的键,一个类型的值,或者如果你愿意,你可以看到{{1作为元组(键,值)的容器,以及元组的一个类型。

当您将异构元素放入Map时,编译器会推断出最严格的元素超类型,如果ListStringDouble

相反,元组具有您想要的属性:每个元素都有自己的类型。

在您的具体示例中:

Any

这将产生List((0.0, "hello world"), (0.0, "huzzah!"), (0.0, "herp a erp"), (0.0, "Open up"), (0.0, "WHY!! That FACE!"))

元组的限制是它们的长度是固定的(在这种情况下为2)。

如果你需要一些结合了列表的可变长度属性和元组类型精度的东西,你可能想要检查无形的' List[(Double, String)]实施。

答案 1 :(得分:1)

List定义为List[+A]。所以它有一种类型,而不是两种类型。 DoubleString的组合为Any。在REPL中,类型显示为List[List[Any]],这是正确的。


scala> List(List(0.0,"hello world"), List(0.0, "huzzah!"), List(0.0,"herp a erp"), List(0.0, "Open up"), List(0.0, "WHY!! That FACE!"))
res30: List[List[Any]] = List(List(0.0, hello world), List(0.0, huzzah!), List(0.0, herp a erp), List(0.0, Open up), List(0.0, WHY!! That FACE!))

您可以使用Tuples获取类似于Double,String

的类型


scala> List(List((0.0,"hello world")), List((0.0, "huzzah!")), List((0.0,"herp a erp")), List((0.0, "Open up")), List((0.0, "WHY!! That FACE!")))
res31: List[List[(Double, String)]] = List(List((0.0,hello world)), List((0.0,huzzah!)), List((0.0,herp a erp)), List((0.0,Open up)), List((0.0,WHY!! That FACE!)))