2017-08-10 46 views
0

有很2種我的代碼,和它的工作:的方法包裝時,不同的行爲:斯卡拉

One使用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

這是你想要的方法。

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

通用A(或任何名字,你想給它)是從Any類型不同。泛指「在List內一致的某種類型」,而Any的含義是「我不知道List中的任何元素」。

所以一個List[Any]不能被夷爲平地,因爲編譯器不知道任何關於列表的內容。 A List[List[Any]]可以變平,但結果是List[Any],它不如List[A]有用,因爲編譯器將附加一個含義AInt,CharString,...),這就是你會回來的( List[Int]List[Char]List[String],....)。