4

v.o.Inner以下代码无法编译,因为编译器无法证明Outer.this.Innervisit(). 我看不出如何告诉编译器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") } 
}
4

1 回答 1

7

编译器无法证明这一点,因为那是错误的。例如:

val o1 = new Outer
val o2 = new Outer
val o2i = new o2.Inner
val v = new Visitor(o1)

o2i.visit(v)

这里Outerofvo1,但Outerof 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") } 
}

但是,如果您走这条路,类型推断将无济于事。您必须明确说明 any 的类型Visitor,如下所示:

val v = new Visitor[o1.type](o1)
于 2013-10-21T06:01:23.180 回答