4

次のコードは、 の実装でv.o.Innerとが同じであることをコンパイラが証明できないため、コンパイルされません。コンパイラー時に認識されるようにする必要があることをコンパイラーに伝える方法がわかりません。何か案は?Outer.this.Innervisit()v.oOuter.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)

ここではOuterofvは ですo1が、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 に答える