如何解决在scala中,如果在家庭外部类型中声明了案例类,如何调用它的通用复制函数? - 第2部分
这是第 1 部分的后续问题:
在第 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
在这种情况下如何使其编译?
解决方法
似乎您正在使用依赖于 OuterSpike
实例的 val inner
改进 outer
val outer = new OuterSpike {
val inner = this.Inner(new Thing)
}
所以尝试使用依赖类型而不是类型投影
def cp(outer: OuterSpike)(src: outer.Inner): outer.Inner = {
src.copy()
}
cp(outer)(outer.inner)
,
也许在 cp
上定义一个无参数 Inner
?
trait OuterSpike {
class Thing
case class Inner(v: Thing) {
def cp() = copy()
}
}
object OuterSpike {
def cp[O <: OuterSpike](src: O#Inner) = src.cp()
val outer = new OuterSpike {
val inner = this.Inner(new Thing)
}
cp(outer.inner)
}
或者,您可以稍微放宽 Inner
的定义:
case class Inner(v: OuterSpike#Thing)
如果你这样定义,那么 def cp[O <: OuterSpike](src: O#Inner) = src.copy()
就可以了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。