Scala 如何为基类/抽象类解析类型类?

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

假设我有一个基本抽象类和两个扩展它的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: 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派生一个实例。如果你用的是猫,你可以看看小猫