如何约束参数类的成员以匹配外部类的实例?

时间:2013-10-21 05:16:50

标签: scala

以下代码无法编译,因为在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") } 
}

1 个答案:

答案 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") } 
}