В Scala есть метод с именем to
, который может преобразовать произвольную коллекцию в другую, если в области видимости есть класс типов с именем CanBuildFrom
.
import scala.collection.generic.CanBuildFrom
import scala.languageFeature.higherKinds
def genericSplitByComma[S[_]](s: String)(implicit cbf: CanBuildFrom[Nothing, String, S[String]]): S[String] = {
s.split(",").to[S]
}
genericSplitByComma[Set]("Hello, hello") //Set(Hello, hello)
genericSplitByComma[List]("Hello, hello") //List(Hello, hello)
genericSplitByComma[Array]("Hello, hello") //Array(hello, world!)
Нам не нужно ограничивать S[_]
, потому что эта функция не будет компилироваться, если нет подходящего CanBuildFrom
в области видимости. Например, это не удастся:
genericSplitByComma[Option]("Hello, hello")
Ниже также произойдет сбой, потому что наш конструктор типов S[_]
принимает только один аргумент типа, а карта ожидает два:
genericSplitByComma[Map]("Hello, hello")
Как заметили Луис Мигель Мехия Суарес и Дмитрий Митин, в коллекциях только что выпущенного Scala 2.13 было главный рефактор , поэтому он будет работать до Scala 2.12.