【发布时间】:2018-01-17 03:13:57
【问题描述】:
是否可以有一个应用于密封特征的类型类?
以下封印特质
sealed trait MyType
object Type1 extends MyType
object Type2 extends MyType
case class Type3(i:Int) extends MyType
我想用一个可以使用以下类型类表示的“显示”函数来丰富这个特征
trait Show[A] {
def show(a: A): String
}
我想在一个接受特征作为输入的函数中使用它
def show[A :< MyType](a: A)(implicit sh: Show[A]) = sh.show(a) // Will not compile
通常我可以做类似的事情
implicit val type3CanShow: Show[Type3] =
new Show[Type3] {
def show(t: Type3): String = s"show ${t.i}"
}
要让它工作,我有两个问题: 1)如何在对象而不是类上定义类型类(即Type1和Type 2) 2)我如何让它接受一个特性的工作,并确保为密封特性的 3 个产品提供类型类
为了解决 2,我可以做类似的事情(不编译 - 假设所有 3 都是案例类)
def show[A :< MyType](a: A)(implicit sh: Show[A]) =
a match {
case t: Type1 => sh.show(t)
case t: Type2 => sh.show(t)
case t: Type3 => sh.show(t)
}
更新:
@thesamet 解决了 1。但是,我仍然想要一个更好的方法来做 2。
运行这样的代码,无需从上面添加模式匹配
def doSomething(t: MyType) = {
show(t)
}
【问题讨论】:
标签: scala