据我了解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
^
此外,这里的编译时错误是什么?
答案 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
的作者只是在书中输入错误。