scala - 如何在 Scala 中接受多种类型
问题描述
我有一些接受多种类型并返回相同类型的重载方法:
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 或其他一些库?
解决方案
尝试类型类
trait FooDoer[T] {
def foo(x: T): Foo
}
object FooDoer {
implicit val int: FooDoer[Int] = (x: Int) => foo(x)
implicit val string: FooDoer[String] = (x: String) => foo(x)
implicit val boolean: FooDoer[Boolean] = (x: Boolean) => foo(x)
implicit val long: FooDoer[Long] = (x: Long) => foo(x)
}
def bar[T](x: T)(implicit fooDoer: FooDoer[T]): Foo = fooDoer.foo(x)
bar(1)
bar("a")
bar(true)
bar(1L)
// bar(1.0) // doesn't compile
有时以下内容也会有所帮助
def bar[T](x: T)(implicit ev: (T =:= Int) | (T =:= String) | (T =:= Boolean) | (T =:= Long)) = ???
trait |[A, B]
trait LowPriority_| {
implicit def a[A, B](implicit a: A): A | B = null
}
object | extends LowPriority_| {
implicit def b[A, B](implicit b: B): A | B = null
}
推荐阅读
- ruby-on-rails - Ruby on rails 6.1.2 从索引页面创建帖子
- python - Plotly Dash 按钮回调函数
- python - 合并两个 pandas 数据框,一个日期不频繁,应按最近日期合并
- amazon-web-services - ECS 服务成本
- firebase - Flutter web - Firebase 消息处理后台通知
- amazon-web-services - 我们如何使用 Cloud Formation 为 Lambda 设置动态变量
- javascript - 在模态框外关闭/打开引导模态?
- javascript - 如何使用 React + TypeScript 从 MobX 5 迁移到 MobX 6,而不添加具有 200% 语法噪音的臃肿代码?
- javascript - 一个不断增加的循环,直到变量小于子节点的长度,不断使我的页面崩溃。为什么?
- apache - 在 .htaccess 中通过 IP 掩码禁止的简单规则