Un moyen qui a a été suggéré pour traiter les doubles définitions de méthodes surchargées est de remplacer la surcharge par le pattern matching :
object Bar {
def foo(xs: Any*) = xs foreach {
case _:String => println("str")
case _:Int => println("int")
case _ => throw new UglyRuntimeException()
}
}
Cette approche exige que nous abandonnions la vérification statique des types sur les arguments à foo
. Il serait beaucoup plus agréable de pouvoir écrire
object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case _: String => println("str")
case _: Int => println("int")
}
}
Je peux m'approcher avec Either
mais cela devient vite moche avec plus de deux types :
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")
}
}
Il semble qu'une solution générale (élégante, efficace) nécessiterait de définir Either3
, Either4
, .... Quelqu'un connaît-il une autre solution pour atteindre le même objectif ? À ma connaissance, Scala n'a pas de "disjonction de type" intégrée. De plus, les conversions implicites définies ci-dessus se cachent-elles quelque part dans la bibliothèque standard pour que je puisse simplement les importer ?