Скала: нескладной Универсальный с универсальный черты характера
Я пытаюсь заполучить бесформенный дженерик для класса 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 ответ:
Вывод работает только дляалгебраических типов данных . Это (запечатанный) признак и классы вариантов (объекты), расширяющие признак.
case class X(a:String) extends UniversalTrait sealed trait UniversalTrait extends Any {} val ok = Generic[X]