Scala:具有普遍特征的不成形通用型
我试图为一个带有标记特征的案例类找到一个不成形的泛型,如下所示:Scala:具有普遍特征的不成形通用型,scala,traits,shapeless,Scala,Traits,Shapeless,我试图为一个带有标记特征的案例类找到一个不成形的泛型,如下所示: case class X(a:String) trait UniversalTrait extends Any {} object MyApp extends App { val ok = Generic[X] val notOk = Generic[X with UniversalTrait] } 它没有编译,错误是在notOk行中找不到参数gen:shapeless.Generic[X with Universa
case class X(a:String)
trait UniversalTrait extends Any {}
object MyApp extends App {
val ok = Generic[X]
val notOk = Generic[X with UniversalTrait]
}
它没有编译,错误是在notOk
行中找不到参数gen:shapeless.Generic[X with UniversalTrait]
的隐式值。为什么呢?有什么办法吗
旁注:我认为这可能与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]
}
}
对象通用属性{
隐式定义gengengeneric[P1派生仅适用于。
这是一个(密封的)特征和扩展该特征的case类(对象)
case class X(a:String) extends UniversalTrait
sealed trait UniversalTrait extends Any {}
val ok = Generic[X]
谢谢。我仍然不明白为什么我尝试的修复没有起作用?@holbech它没有起作用,因为X with UniversalTrait
不是代数数据类型(尽管它等于代数数据类型,隐式地[X with UniversalTrait=:=X]
当case class X(a:String)扩展UniversalTrait
时)。宏根本不需要这种类型。@holbech如果将scalacOptions+=“-Xlog implicits”
添加到build.sbt,则会看到:信息:(35,6)shapess.this.Generic.materialize不是shapess.Generic.Aux[App8.this.X和App8.this.UniversalTrait,String::shapess.HNil]的有效隐式值因为:hasMatchingSymbol报告的错误:App8.this.X与App8.this.UniversalTrait不是一个case类,类似case类,是一个密封的特征或单元[Generic.Aux[X与UniversalTrait,String::HNil]