首页 > 解决方案 > Shapeless 无法提供 Annotations.Aux 的隐式实例

问题描述

我正在尝试简化从案例类中提取的注释,但我仍然希望尽可能保持通用性。所以,我创建了一个简单的类型类,它没有任何用处(目前),但它接受两个类型参数:

trait Show2[+A, -T] {
  def show: Unit
}

我有一个简单的隐式函数来派生这个类型类的实例:

implicit def genericEncoder[A, T, ARepr <: HList](
  implicit annotations: Annotations.Aux[A, T, ARepr]
): Show2[A, T] = new Show2[A, T] {
  override def show: Unit = println(annotations())
}

基本上,它是某种包装器Annotations.Aux

为了测试我使用数据类和注释类本身:

case class ann(v: Int) extends StaticAnnotation
case class C(@ann(1) s: String, @ann(2) i: Int)

所以,我期待之后会打印出一些东西

val encoder = implicitly[Show2[ann, C]]
encoder.show

但我得到了could not find implicit value for parameter e: Show2[Main2.ann,Main2.C]。当我使用具体类型ann而不是通用类型时AgenericEncoder它可以工作,但这不是我需要的。

任何想法,我在这里做错了什么?

斯卡斯蒂片段

标签: scalagenericsannotationsshapeless

解决方案


由于 Show2 类型类中的差异,它似乎不起作用(Annotations.Aux 中的类型参数是不变的)


推荐阅读