使用 有人建议来处理重载方法的双重定义的一种方法是用模式匹配代替重载:
object Bar {
def foo(xs: Any*) = xs foreach {
case _:String => println("str")
case _:Int => println("int")
case _ => throw new UglyRuntimeException()
}
}
这种方法要求我们将参数的静态类型检查交给 foo
。如果能写作就好了
object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case _: String => println("str")
case _: Int => println("int")
}
}
我可以接近 Either
,但它变得丑陋的速度超过两种类型:
type or[L,R] = Either[L,R]
implicit def l2Or[L,R](l: L): L or R = Left(l)
implicit def r2Or[L,R](r: R): L or R = Right(r)
object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case Left(l) => println("str")
case Right(r) => println("int")
}
}
看起来一个通用的(优雅的,高效的)解决方案需要定义 Either3
,Either4
,... 。有人知道达到同样目的的替代方案吗?据我所知,Scala 没有内置的“类型分离”。另外,上面定义的隐式转换是否潜伏在标准库的某个地方,以便我可以直接导入它们?