以下代码无法编译,因为在v.o.Inner
的实现中,编译器无法证明Outer.this.Inner
和visit()
是相同的。我无法看到如何告诉编译器,v.o
必须是Outer.this
,以便在编译器时识别它。有什么想法吗?
class Outer {
class Inner {
def visit(v:Visitor) = v.visitInner(this)
}
}
class Visitor(val o:Outer) {
def visitInner(i:o.Inner) = { println("foo") }
}
答案 0 :(得分:7)
编译器无法证明这是因为那是错误的。例如:
val o1 = new Outer
val o2 = new Outer
val o2i = new o2.Inner
val v = new Visitor(o1)
o2i.visit(v)
此处Outer
的{{1}}为v
,但o1
Outer
的{{1}}为this
。
如果你问的是如何强制执行这些类型,那么这可能会有所帮助:
o2i
但是,如果你走这条路线,类型推断将无济于事。你必须明确任何o2
的类型,如下所示:
class Outer {
self =>
class Inner {
def visit(v:Visitor[self.type]) = v.visitInner(this)
}
}
class Visitor[T <: Outer](val o:T) {
def visitInner(i:o.Inner) = { println("foo") }
}