Scala 如何为基类/抽象类解析类型类?
假设我有一个基本抽象类和两个扩展它的case类Scala 如何为基类/抽象类解析类型类?,scala,typeclass,Scala,Typeclass,假设我有一个基本抽象类和两个扩展它的case类 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
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
上定义一个实例来解决这个问题,并进行模式匹配,但在我看来,最好不要使用类型类
我们可以为基类创建scala解析类型类吗?
谢谢。不,没有这样的把戏。类型必须是静态已知的,因为是编译器解析类型类实例
正如您所说,必须为
Base
创建一个实例来解析正确的实例。可以手动完成,但可能有更好的方法。也许有人可以提供一个更好的答案,说明如何做得更好,但基本上需要Base
的实例。我没有时间写一个完整的答案,但你肯定可以使用Shapeless或Magnolia()并为sealed trait派生一个实例。如果你用的是猫,你可以看看小猫