【发布时间】:2018-06-26 19:43:29
【问题描述】:
假设我有一个基本抽象类和 2 个扩展它的案例类。
sealed abstract class Base extends Product with Serializable
case class A(d: String) extends Base
case class B(d: Int) extends Base
例如,我在A 和B 上也有一个类型类
trait Show[T] {
def show(t: T): String
}
object Show {
def apply[T](t: T)(implicit show: Show[T]): String = show.show(t)
implicit val showA: Show[A] = new Show[A] {
def show(t: A): String = "A"
}
implicit val showB: Show[B] = new Show[B] {
def show(t: B): String = "B"
}
}
我遇到的问题是,在我的代码中,我从反序列化中得到A 和B,它们的类型为Base。在这种情况下,scala 无法解析类型类,因为Base 上没有定义类型类。
我可以通过在Base 上定义一个实例并进行模式匹配来解决这个问题,但 IMO 以这种方式我们最好不要使用类型类。
有什么技巧可以让 scala 为基类解析类型类吗? 谢谢。
【问题讨论】:
-
我没有时间写一个完整的答案,但你绝对可以使用 Shapeless 或 Magnolia (magnolia.work) 并为密封特征派生一个实例。如果您使用猫,您可以查看小猫github.com/milessabin/kittens