#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
это работает, но это не то, что мне нужно.
Любые мысли, что я здесь делаю не так?
Комментарии:
1. кажется, что это не работает из-за различий в
Show2
классе типов (параметры типа вAnnotations.Aux
инвариантны)2. Да, вы правы. Большое спасибо, что выяснили это!
3. я добавил его в качестве ответа, поэтому не могли бы вы принять его, если сочтете его полезным?
Ответ №1:
похоже, что это не работает из-за различий в классе типов Show2 (введите параметры в аннотациях.Aux инвариантны)