我创建了一个ListBuffer[ List[Any]] ()
,其输出如下:
for (x <- list_buff){
println(x)
}
/** =======OutPut==================
List(List(i), List(feel))
List(List(feel), List(good))
List(List(good), List(when))
List(List(when), List(i))
List(List(i), List(am))
............
=================**/
所以它是List[List[String],List[String]]
,所以类型推断应该可以解决。但是,当我尝试应用诸如map()
,isEmpty
甚至是toList
之类的List方法时,会出现类似方法无法在类型Any
上运行的错误。而且,我也无法使用常规的toList
方法。我该如何解决?我尝试使用ListBuffer[ List[ List[String],List[String] ] ]
进行定义,但是它说List
只接受一个参数。
答案 0 :(得分:1)
这个问题尚不清楚,但是我假设您创建了一个字符串列表列表,并将其注释为“任意列表列表”,并且您想知道为什么类型不匹配。
几件事:
List
实际上仅接受一个参数。 List(List("a", "b"), List("c", "d"))
具有类型List[List[String]]
而非List[List[String], List[String]]
toString
在运行时打印其打印内容的事实是List
的{{1}}如何工作的结果:toString
。这并不意味着编译器知道类型s"List(${elements.mkString(", ")})"
的函数,则无权“猜测”它将为List[List[Any]]
。如果它是List[List[String]]
,那么它将根据需要推断类型。基本上,类型推断不会神奇地猜测您所拥有的。给出有关变量,常量和函数的信息,即俗称“最大公分母”(或具体说是“最小上限”),它将计算出最具体的类型。
如果您没有注释值,并且以Any结尾,则代码有一些问题(未显示)-Any是所有其他类型的超类型(顶部类型),并且如果它看起来像是推断类型,这意味着编译器必须推断没有共同点的事物的共同部分,因此您很可能弄乱了某些东西(例如val x = List(List("a", "b"), List("c", "d"))
会变成List("a", 1)
)。