这个问题还不清楚,但我假设您创建了一个字符串列表,并将其注释为Any的列表,您想知道为什么类型不匹配。
有几件事:
-
List
实际上只需要一个参数。
List(List("a", "b"), List("c", "d"))
有一种类型
List[List[String]]
不
List[List[String], List[String]]
-
事实上
toString
在运行时打印它打印的内容是
列表
的
托斯特林
工作:
s"List(${elements.mkString(", ")})"
. 这并不意味着编译器知道类型
-
编译器根据它在编译时知道的信息推断类型。如果创建函数返回
List[List[Any]]
它没有权利“猜测”它会
列表[列表[字符串]]
. 如果是的话
val x = List(List("a", "b"), List("c", "d"))
然后它会推断出你想要的类型。
基本上,类型推断并不能神奇地猜测你有什么。它根据变量、常数和函数的信息计算最具体的类型,通俗地说是“最大公分母”(或者具体地说是“最小上界”)。
如果您没有注释这些值,最后得到的是Any,那么您在代码中遇到了一些问题(您没有显示)-Any是所有其他类型(top type)的超类型,如果它显示为推断类型,则意味着编译器必须推断出没有共同点的事物的公共部分,所以很可能您弄糟了一些东西(例如。
List("a", 1)
会变成
List[Any]
).