简体   繁体   English

在scala中为递归类型指定泛型的正确方法

[英]correct way to specify generic for recursive type in scala

I use recursive types in scala when I need return from a class result with exactly same type (no variance allowed). 当我需要从具有完全相同类型的类结果中返回时(不允许方差),我在scala中使用了递归类型。

I've meet some problems with integrating this pattern with other constructions. 我在将此模式与其他结构集成时遇到了一些问题。

Provided example: 提供的示例:

object Test {
  trait Recursive[R <: Recursive[R]]
  case class RecInt(data : Int) extends Recursive[RecInt]
  case class RecFloat(data : Float) extends Recursive[RecFloat]

  final case class ListHolder( rec : List[Recursive[_]] ) {
    def get[R <: Recursive[R]](index : Int) : R = rec(index).asInstanceOf[R]
  }
  val lh = ListHolder(List( RecInt(1), RecFloat(1.5f) ))
  val l0 : RecInt = lh.get(0)

  final case class SingleHolder ( rec : Recursive[_] ) {
    def get[R <: Recursive[R]] : R = rec.asInstanceOf[R]
  }
}

gives error output 提供错误输出

/home/ayvango/Work/scala/test/RecursiveContainer.scala:12: error: type arguments [_$2] do not conform to trait Recursive's type parameter bounds [R <: Main.$anon.Test.Recursive[R]]
  final case class SingleHolder ( rec : Recursive[_] ) {
               ^
one error found

the error description is absolutely clear. 错误描述是绝对清楚的。

How should I specify type bounds to fit the requirements? 我应该如何指定类型界限以符合要求?


update: 更新:

I need to hide type information. 我需要隐藏类型信息。 I may just use List of length 1 to hide it. 我可能只使用长度为1的列表将其隐藏。 But there should be equivalent for that 但是应该有等同的

I've tried this form: 我已经尝试过这种形式:

final case class SingleHolder ( rec : Recursive[T] forSome {type T <: Recursive[T]} ) {
  def get[R <: Recursive[R]] : R = rec.asInstanceOf[R]
}

but got this error: 但是出现了这个错误:

error: scala.tools.nsc.symtab.Types$TypeError: type mismatch;
 found   : Test.Recursive[(some other)_1(in method equals)] where type (some other)_1(in method equals) <: Test.Recursive[_0]
 required: Test.Recursive[_ <: Test.Recursive[_0]]
        at scala.tools.nsc.typechecker.Contexts$Context.error(Contexts.scala:298)
        at scala.tools.nsc.typechecker.Infer$Inferencer.error(Infer.scala:207)
        at scala.tools.nsc.typechecker.Infer$Inferencer.typeError(Infer.scala:217)
        at scala.tools.nsc.typechecker.Infer$Inferencer.typeErrorTree(Infer.scala:232)
        at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:936)
        at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:719)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4282)
        at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:2191)
        at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedArgs$3.apply(Typers.scala:2204)
        at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedArgs$3.apply(Typers.scala:2203)
        at scala.Tuple3$Zipped$$anonfun$map$1.apply(Tuple3.scala:66)
        at scala.Tuple3$Zipped$$anonfun$map$1.apply(Tuple3.scala:64)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at scala.Tuple3$Zipped.map(Tuple3.scala:64)
        at scala.tools.nsc.typechecker.Typers$Typer.typedArgs(Typers.scala:2203)
        at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:2423)
        at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:3373)
        at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4106)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4333)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$5.apply(ExplicitOuter.scala:400)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$5.apply(ExplicitOuter.scala:387)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
        at scala.collection.immutable.List.map(List.scala:76)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.matchTranslation(ExplicitOuter.scala:387)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:511)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:873)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:873)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformTrees(Trees.scala:873)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:837)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:783)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:781)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:780)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:480)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:460)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:460)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:761)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:761)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:760)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:51)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:51)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:51)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:892)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.scala$tools$nsc$transform$ExplicitOuter$ExplicitOuterTransformer$$super$transformUnit(ExplicitOuter.scala:529)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$transformUnit$1.apply(ExplicitOuter.scala:529)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$transformUnit$1.apply(ExplicitOuter.scala:529)
        at scala.tools.nsc.symtab.SymbolTable.atPhase(SymbolTable.scala:95)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transformUnit(ExplicitOuter.scala:529)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transformUnit(ExplicitOuter.scala:318)
        at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
        at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:329)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
        at scala.collection.Iterator$class.foreach(Iterator.scala:772)
        at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:318)
        at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:297)
        at scala.tools.nsc.transform.ExplicitOuter$Phase.run(ExplicitOuter.scala:539)
        at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
        at scala.tools.nsc.Global$Run.compile(Global.scala:1041)
        at scala.tools.nsc.Main$.process(Main.scala:106)
        at scala.tools.nsc.Main$.main(Main.scala:123)
        at scala.tools.nsc.Main.main(Main.scala)

Exception in thread "main" scala.tools.nsc.symtab.Types$TypeError: type mismatch;
 found   : Test.Recursive[(some other)_1(in method equals)] where type (some other)_1(in method equals) <: Test.Recursive[_0]
 required: Test.Recursive[_ <: Test.Recursive[_0]]
        at scala.tools.nsc.typechecker.Contexts$Context.error(Contexts.scala:298)
        at scala.tools.nsc.typechecker.Infer$Inferencer.error(Infer.scala:207)
        at scala.tools.nsc.typechecker.Infer$Inferencer.typeError(Infer.scala:217)
        at scala.tools.nsc.typechecker.Infer$Inferencer.typeErrorTree(Infer.scala:232)
        at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:936)
        at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:719)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4282)
        at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:2191)
        at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedArgs$3.apply(Typers.scala:2204)
        at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedArgs$3.apply(Typers.scala:2203)
        at scala.Tuple3$Zipped$$anonfun$map$1.apply(Tuple3.scala:66)
        at scala.Tuple3$Zipped$$anonfun$map$1.apply(Tuple3.scala:64)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at scala.Tuple3$Zipped.map(Tuple3.scala:64)
        at scala.tools.nsc.typechecker.Typers$Typer.typedArgs(Typers.scala:2203)
        at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:2423)
        at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:3373)
        at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4106)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
        at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4333)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$5.apply(ExplicitOuter.scala:400)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$5.apply(ExplicitOuter.scala:387)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
        at scala.collection.immutable.List.map(List.scala:76)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.matchTranslation(ExplicitOuter.scala:387)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:511)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:873)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:873)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformTrees(Trees.scala:873)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:837)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:783)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:781)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:780)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:480)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:460)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:460)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:761)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:761)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:760)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:51)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:51)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:51)
        at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:257)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:521)
        at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:892)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.scala$tools$nsc$transform$ExplicitOuter$ExplicitOuterTransformer$$super$transformUnit(ExplicitOuter.scala:529)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$transformUnit$1.apply(ExplicitOuter.scala:529)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer$$anonfun$transformUnit$1.apply(ExplicitOuter.scala:529)
        at scala.tools.nsc.symtab.SymbolTable.atPhase(SymbolTable.scala:95)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transformUnit(ExplicitOuter.scala:529)
        at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transformUnit(ExplicitOuter.scala:318)
        at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
        at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:329)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
        at scala.collection.Iterator$class.foreach(Iterator.scala:772)
        at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:318)
        at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:297)
        at scala.tools.nsc.transform.ExplicitOuter$Phase.run(ExplicitOuter.scala:539)
        at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
        at scala.tools.nsc.Global$Run.compile(Global.scala:1041)
        at scala.tools.nsc.Main$.process(Main.scala:106)
        at scala.tools.nsc.Main$.main(Main.scala:123)
        at scala.tools.nsc.Main.main(Main.scala)

I'm curios how can I simulate same behavior as with lists 我很想知道如何模拟与列表相同的行为

Body of topic is limited and I post here next update on my searching: 主题范围有限,我将在此处发布有关搜索的下一个更新:


update2: 更新2:

for now I use this shame construction: 现在,我使用这种可耻的构造:

final case class TypeErasure[T](data : T)

final case class SingleHolder ( rec : TypeErasure[Recursive[_]] ) {
  def get[R <: Recursive[R]] : R = rec.data.asInstanceOf[R]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM