路径依赖类型和类型投影

时间:2013-12-21 23:24:25

标签: scala

据我了解def bar(x: X#Inner)签名,它只需要任何 Inner实例即可成功编译。然而,foo(x: this.Inner)只能使用相同的Outer.Inner类实例进行编译。

在阅读Scala in Depth时,我将此代码放入REPL,但是我遇到了编译时错误。

scala> class Outer {
     |    trait Inner
     |     def y = new Inner {}
     |    def foo(x: this.Inner) = null
     |    def bar(x: X#Inner) = null
     | }
<console>:11: error: not found: type X
          def bar(x: X#Inner) = null
                     ^

此外,这里的编译时错误是什么?

2 个答案:

答案 0 :(得分:1)

X中的X#Inner是指外部类型。你在任何地方都没有类型X,这就是编译器错误所说的确切内容。

在您的示例中,您需要引用类型Outer

class Outer {
  trait Inner
  def foo(x: this.Inner) = ???
  def bar(x: Outer#Inner) = ???
}

答案 1 :(得分:0)

X#Inner应为Outer#Inner,我认为Scala in depth的作者只是在书中输入错误。