Возвращает один и тот же тип коллекции, по-разному параметризованный - PullRequest
4 голосов
/ 23 декабря 2011

Даниэль Собрал показал, как мы можем создать метод, который возвращает тот же тип коллекции, на который он был вызван, в своем ответе на этот вопрос: Возвращение исходного типа коллекции в универсальном методе

Можно ли сделать то же самое для метода, который использует сопоставление для возврата версии с разными параметрами одного и того же типа коллекции?

Например

def foo[A](xs: GenTraversable[A]) = xs map (_.toString)

foo( List(1, 2, 3) ) возвращает res: GenTraversable[String] = List(1, 2, 3)

Можно ли это адаптировать так, чтобы

foo( Set(1, 2, 3) ) возвращает Set[String]

foo( List(1, 2, 3) ) возвращает List[String]

foo( Vector(1, 2, 3) ) возвращает Vector[String]

1 Ответ

7 голосов
/ 23 декабря 2011

Расширение ответа Даниэля на связанный вопрос:

def foo[A,T[X] <: TraversableLike[X,T[X]]](xs: T[A])(implicit cbf: CanBuildFrom[T[A],String,T[String]]):  T[String] = xs.map(_.toString)

Обратите внимание, что метод map, определенный в TraversableLike, принимает неявный CanBuildFromпараметр.Это используется для создания компоновщика для желаемого типа коллекции, поэтому его необходимо параметризовать так, как он есть в коде (т. Е. На основе коллекции типа T[A], построить T[String] из элементов String).

...