我觉得您应该为两者编写一个单独的函数,但是还有其他方法可以做到:
在 Dotty 中,您可以只使用联合类型,这是我在这里推荐的:
编辑:根据 Alexey Romanov 的建议,替换Seq[AnyVal | String]
为Seq[AnyVal | String]
,这是错误的,
def foo(seq: Seq[AnyVal] | Seq[String]): Unit = {
println(seq)
}
斯卡斯蒂
如果您不使用 Dotty,您仍然可以在 Scala 2 中使用几个可重复使用implicit def
的 s
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def foo[T](seq: Seq[T])(implicit ev: Or[T <:< AnyVal, T =:= String]): Unit =
println(seq)
foo(Seq("baz", "waldo"))
foo(Seq(23, 34))
foo(Seq(List(), List())) //This last one fails
斯卡斯蒂
正如 Luis Miguel Mejía Suárez 建议的那样,您也可以使用类型类来完成它,但我不建议将它用于如此琐碎的任务,因为您仍然必须为每种类型定义 2 个函数,以及一个 trait、2 个隐式对象和一个可以使用该特征实例的函数。您可能不希望这种模式只处理 2 种不同的类型。
sealed trait DoSomethingToIntOrString[T] {
def doSomething(t: Seq[T]): Unit
}
implicit object DoSomethingToAnyVal extends DoSomethingToAnyValOrString[AnyVal] {
def doSomething(is: Seq[AnyVal]): Unit = println(is)
}
implicit object DoSomethingToString extends DoSomethingToIntOrString[String] {
def doSomething(ss: Seq[String]): Unit = println(ss)
}
def foo[T](t: Seq[T])(implicit dsis: DoSomethingToIntOrString[T]): Unit = {
dsis.doSomething(t)
}
foo(Seq("foo", "bar"))
foo(Seq(1, 2))
在斯卡斯蒂