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

时间:2018-06-26 09:34:17

标签: scala typeclass

说我有一个基本抽象类和2个扩展它的案例类。

sealed abstract class Base extends Product with Serializable

case class A(d: String) extends Base
case class B(d: Int) extends Base

例如,我在AB上也有一个类型类

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"
  }
}

我的问题是,在我的代码中,我从反序列化中获得了AB,它们的类型为Base。在这种情况下,scala无法解析类型类,因为Base上没有定义类型类。

我可以通过在Base上定义实例并进行模式匹配来解决此问题,但是IMO这样最好不要使用类型类。

我们有什么技巧可以使scala解析基类的类型类? 谢谢。

1 个答案:

答案 0 :(得分:1)

不,没有这样的把戏。类型必须是静态已知的,因为解析类型类实例的是编译器。

正如您所说,必须创建Base的实例,它将解析正确的实例。可以手动完成,但可能会有更好的方法。也许有人可以为如何做得更好提供更好的答案,但是从根本上来说,Base的实例是必需的。