scala - 如何使方法返回与输入相同的泛型?

标签 scala generics type-conversion polymorphism scala-collections

我想拆分由逗号分隔的字符串,并将结果用作 SeqSet :

def splitByComma(commaDelimited: String): Array[String]
  = commaDelimited.trim.split(',')

def splitByCommaAsSet(commaDelimited: String): Set[String]
  = splitByComma(commaDelimited).toSet

def splitByCommaAsSeq(commaDelimited: String): Seq[String]
  = splitByComma(commaDelimited).toSeq

val foods = "sushi,taco,burrito"
val foodSet = splitByCommaAsSet(foods)
// foodSet: scala.collection.immutable.Set[String] = Set(sushi, taco, burrito)
val foodSeq = splitByCommaAsSeq(foods)
// foodSeq: Seq[String] = List(sushi, taco, burrito)

然而,这是相当重复的。理想情况下,我想要类似 genericSplitByComma[Set](foods) 的东西。只返回 Set当我通过Set in,并返回 Seq当我通过Seq .

最佳答案

@KrzysztofAtłasik 的回答非常适合 斯卡拉 2.12 .
这是2.13的解决方案. (不完全确定这是否是最好的方法)。

import scala.collection.Factory
import scala.language.higherKinds

def splitByComma[C[_]](commaDelimited: String)(implicit f: Factory[String, C[String]]): C[String] =
  f.fromSpecific(commaDelimited.split(","))
  // Or, as Dmytro stated, which I have to agree looks better.
  commaDelimited.split(",").to(f)

您可以像这样使用:
splitByComma[Array]("hello,world!")
// res: Array[String] = Array(hello, world!)

splitByComma[Set]("hello,world!")
// res: Set[String] = Set(hello, world!)

splitByComma[List]("hello,world!")
// res: List[String] = List(hello, world!)

关于scala - 如何使方法返回与输入相同的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56551015/

相关文章:

scala - 了解Scala符号语法

scala - 将 Scala 反射与 Java 反射结合使用

c# - 通用方法将委托(delegate)传递给方法?

实现接口(interface)的java方法泛型

generics - JSX 节点中的 TypeScript 类型参数

java - 将对象类型转换为枚举不会给出枚举或错误

python - 将列表传递给需要相同长度元组的函数

java - 如何在 Java 中打印原始变量的类型

伴随类型的 Scala 类型约束

scala - 如何使包可用于 Scala REPL?