将ListBuffer [List [Any]]转换为任何类型的元素以推断类型

时间:2018-09-09 01:24:50

标签: scala list dictionary

我创建了一个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只接受一个参数。

1 个答案:

答案 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))。