2017-08-10 1 views
0

Il sont deux types de mon code, et cela a fonctionné:comportement différent lors de l'enveloppement dans une méthode: scala

On utilise flatten directement

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

L'autre utilisation d'une méthode

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 
} 

Et il y a une erreur:

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 

Pourquoi et comment le résoudre?

Répondre

1

C'est la méthode que vous voulez.

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

Le A générique (ou quel que soit le nom que vous voulez donner) est différent de le type Any. Le terme générique signifie "un type qui est cohérent dans le List" tandis que Any signifie "Je ne sais rien de l'un des éléments du List".

Donc un List[Any] ne peut pas être aplani parce que le compilateur ne sait rien sur le contenu de la liste. Un List[List[Any]] peut être aplati mais le résultat est un List[Any] qui n'est pas aussi utile que List[A] parce que le compilateur aura attaché une signification à A (Int, Char, String, ....) et c'est ce que vous obtiendrez (List[Int], List[Char], List[String], ....).