代码之家  ›  专栏  ›  技术社区  ›  Raafi

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

  •  -1
  • Raafi  · 技术社区  · 6 年前

    我创造了一个 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 ,我得到的错误类似于方法无法处理类型 Any . 而且,我用将军也不成功 托利斯特 方法也是。我该怎么解决?我试着用 ListBuffer[ List[ List[String],List[String] ] ] 但它说 List 只接受一个参数。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mateusz Kubuszok    6 年前

    这个问题还不清楚,但我假设您创建了一个字符串列表,并将其注释为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] ).