包装在方法中的不同行为:scala

时间:2017-08-10 02:01:06

标签: scala scala-collections

有两种我的代码,它起作用了:

直接使用flatten

val list = List(List(1, 2), List(3, 4))
println(list.flatten)

另一个使用方法

val list = List(List(1, 2), List(3, 4))
println(flatten(list))

def flatten(list: List[Any]): List[Any] = {
        list.flatten//this is the line 28
}

出现了错误:

Error:(28, 14) No implicit view available from Any => scala.collection.GenTraversableOnce[B].
        list.flatten

Error:(28, 14) not enough arguments for method flatten: (implicit asTraversable: Any => scala.collection.GenTraversableOnce[B])List[B].
Unspecified value parameter asTraversable.
        list.flatten

为什么以及如何解决它?

1 个答案:

答案 0 :(得分:1)

这是你想要的方法。

def flatten[A](list: List[List[A]]): List[A] = {
  list.flatten
}

通用A(或您想要提供的任何名称)与类型Any不同。通用意味着“某些类型在List”内保持一致,而Any表示“我对List”中的任何元素一无所知。

因此,List[Any]无法展平,因为编译器对列表的内容一无所知。 List[List[Any]]可以展平,但结果是List[Any],它不如List[A]有用,因为编译器会附加A的含义({{1} },IntChar,....)这就是你会得到的回报(StringList[Int]List[Char],.... )。