Scala:在编译时验证唯一类型是否存在

rkkpypqq  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(84)

我有以下几点:

sealed trait Tag
case object MyTag1 extends Tag
case object MyTag2 extends Tag

sealed trait Error[T <: Tag]

// error implementations...

字符串
我希望两个使用相同TagError实现在编译时失败,但在没有关联Error的情况下不会失败。
第一个答案中给出的编译保护:How can I verify type existence on compile time in Scala非常接近我想要的,但是如果存在一个没有关联ErrorTag,则在编译时失败。

z18hc3ub

z18hc3ub1#

您可以尝试向Poly添加多个案例

def compilationGuard[C <: Coproduct]()(implicit
  gen: Generic.Aux[Signal, C],
  mapper: Mapper[uniqueDescriptionPoly.type, C]
) = null

object uniqueDescriptionPoly extends Poly1 {
  implicit def cse[S <: Signal, C1 <: Coproduct](implicit
    gen1: Generic.Aux[Description[S], C1],
    ev: C1 <:< (_ :+: CNil)
  ): Case.Aux[S, Null] = null

  implicit def cse0[S <: Signal, C1 <: Coproduct](implicit
    gen1: Refute[Generic[Description[S]]]
  ): Case.Aux[S, Null] = null
}

compilationGuard()

x

final case class S1(name: String) extends Signal
final case class S2(name: String) extends Signal
final case class D1(name: String) extends Description[S1]
//compiles
final case class S1(name: String) extends Signal
final case class S2(name: String) extends Signal
final case class D1(name: String) extends Description[S1]
final case class D2(name: String) extends Description[S1]
// doesn't compile
final case class S1(name: String) extends Signal
final case class S2(name: String) extends Signal
final case class D1(name: String) extends Description[S1]
final case class D2(name: String) extends Description[S2]
// compiles

的数据

相关问题