У меня есть несколько перегруженных методов, которые принимают несколько типов и возвращают один и тот же тип:
def foo(x: Int): Foo = ...
def foo(x: String): Foo = ...
def foo(x: Boolean): Foo = ...
def foo(x: Long): Foo = ...
Теперь я хочу определить единственный способ вызова метода, например:
def bar(x: Int | String | Boolean | Long) = foo(x) // how to do this?
Я могу сделать это «наивным» способом, который мне не очень нравится:
def bar(x: Any) = x match {
case i:Int => foo(i)
case s:String => foo(s)
case b:Boolean => foo(b)
case l:Long => foo(l)
case _ => throw new Exception("Unsupported type")
}
Есть ли способ лучше, возможно, используя Scalaz или какую-нибудь другую библиотеку?