Скала: нескладной Универсальный с универсальный черты характера


Я пытаюсь заполучить бесформенный дженерик для класса case с маркерным признаком, например:

case class X(a:String)

trait UniversalTrait extends Any {}

object MyApp extends App {
  val ok = Generic[X]
  val notOk = Generic[X with UniversalTrait]
}

Он не компилируется, с ошибкой could not find implicit value for parameter gen: shapeless.Generic[X with UniversalTrait] в строке notOk. Почему это так? И можно ли что-то сделать?

Примечание: я подумал, что это может быть связано с тем, что from не может добавить признак маркера к возвращаемому экземпляру, поэтому я попытался исправить ситуацию, добавив следующее:

object UniversalTrait {
  implicit def genGeneric[P1<:Product with UniversalTrait,P2<:Product,L<:HList]
                 (implicit constraint: P1 =:= P2 with UniversalTrait,
                           underlying: Generic.Aux[P2,L]): Generic.Aux[P1,L] = new Generic[P1]{
        type Repr=L
        def to(t: P1): Repr = underlying.to(t)
        def from(r: Repr): P1 = underlying.from(r).asInstanceOf[P1]
  }
}
Однако ошибка остается.
1 3

1 ответ:

Вывод работает только дляалгебраических типов данных . Это (запечатанный) признак и классы вариантов (объекты), расширяющие признак.

case class X(a:String) extends UniversalTrait

sealed trait UniversalTrait extends Any {}

val ok = Generic[X]