Я экспериментировал с трейтом CanBuildFrom на Scala, он выглядит нормально, когда я пытаюсь автоматически преобразовать тип Array в тип Seq, я думаю, причина в том, что у нас есть CanBuildFrom[Array, T, Seq[T]] в области видимости. Однако, если я попытаюсь преобразовать массив в набор, это не сработает. Кроме того, преобразование последовательности в набор также не работает. Мне просто интересно, должен ли я определить неявный объект-компаньон CanBuildFrom того же типа для реализации преобразования? Если это так, почему scala не предоставляет его по умолчанию, причина, по которой Set - это функция?
Вот код, который для Array to Seq
def transform[U[_]](col: Array[String])(implicit cbf: CanBuildFrom[Array[String], String, U[String]]): U[String] = {
val builder = cbf()
for (ele <- col) builder += ele
builder.result()
}
CanBuildFromSpec.transform[Seq](Array("123", "3"))
Если я хочу преобразовать массив в набор или список, он не работает
CanBuildFromSpec.transform[List](Array("123", "3")) //compilation error, cannot construct
CanBuildFromSpec.transform[Set](Array("123", "3")) //compilation error, cannot construct
collection.breakOut
в качествеCanBuildFrom
для вашегоtransform
, чтобы позволить вам создать любую коллекцию (любую, которая может содержать как минимум строки). Либо можно объявить неявныйCanBuildFrom
нужного типа. - person wingedsubmariner   schedule 30.05.2014