**赏金5天后到期。回答此问题可获得+150声望奖励。tribbloid正在寻找一个可靠来源的答案。
这是第1部分的后续问题:
在scala中,如果case类是在家族外部类型中声明的,如何调用它的泛化copy函数?
在第2部分中,族类的定义变得稍微复杂一些:
trait OuterSpike {
class Thing
case class Inner(v: Thing) {
// val outer = self
}
}
object OuterSpike {
{
def cp(src: OuterSpike#Inner): OuterSpike#Inner = {
src.copy()
}
def cp2[O <: OuterSpike](src: O#Inner): O#Inner = src.copy()
val outer = new OuterSpike {
val inner = this.Inner(new Thing)
}
cp(outer.inner)
}
}
因此,旧的技巧不再有效,上面编译时出现以下错误:
[Error] /home/peng/git/shapesafe/graph-commons/src/main/scala/com/tribbloids/graph/commons/util/reflect/format/OuterSpike.scala:18: type mismatch;
found : com.tribbloids.graph.commons.util.reflect.format.OuterSpike#Thing
required: _1.Thing where val _1: com.tribbloids.graph.commons.util.reflect.format.OuterSpike
[Error] /home/peng/git/shapesafe/graph-commons/src/main/scala/com/tribbloids/graph/commons/util/reflect/format/OuterSpike.scala:21: type mismatch;
found : O#Thing
required: _1.Thing where val _1: O
two errors found
在这种情况下如何使其编译?
2条答案
按热度按时间kokeuurv1#
看来你在精炼
OuterSpike
与val inner
这取决于outer
示例所以尝试使用依赖类型而不是类型投影
mspsb9vt2#
定义无参数
cp
上Inner
也许?或者,您可以放宽
Inner
一点点:如果你这样定义,那么
def cp[O <: OuterSpike](src: O#Inner) = src.copy()
作品。