Shapeless не может предоставить неявный экземпляр аннотаций.Aux

#scala #generics #annotations #shapeless

#scala #общие #аннотации #бесформенный

Вопрос:

Я пытаюсь упростить извлечение аннотаций из классов case, но я все еще хочу оставаться как можно более общим. Итак, я создал простой класс типов, который не делает ничего полезного (на данный момент), но он принимает два параметра типа:

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

И у меня есть простая неявная функция для получения экземпляров этого типа class:

 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 вместо общего A , genericEncoder это работает, но это не то, что мне нужно.

Любые мысли, что я здесь делаю не так?

фрагмент scastie

Комментарии:

1. кажется, что это не работает из-за различий в Show2 классе типов (параметры типа в Annotations.Aux инвариантны)

2. Да, вы правы. Большое спасибо, что выяснили это!

3. я добавил его в качестве ответа, поэтому не могли бы вы принять его, если сочтете его полезным?

Ответ №1:

похоже, что это не работает из-за различий в классе типов Show2 (введите параметры в аннотациях.Aux инвариантны)