2017-07-10 84 views
2

对于C类,你可以使用熟悉的this身体内部来指代当前实例,但this实际上是在斯卡拉C.this的缩写:无法理解路径依赖型

class C { 
    var x = "1" 
    def setX1(x:String) = this.x = x 
    def setX2(x:String) = C.this.x = x 
} 

我只是不明白C.this,C是一个类,我不明白为什么我们使用Cthis之间的点,如C.this所示?

回答

1

我不明白为什么我们用C点之间,这如图 C.this

this之前使用类的名字叫做Java中的Qualified this(见Using "this" with class name),是类似于斯卡拉。当你想从内部类引用外部类时使用它。让我们假设,例如,你有你的C类中的方法声明,你想叫this和平均“了C此引用:

class C { 
    val func = new Function0[Unit] { 
    override def apply(): Unit = println(this.getClass) 
    } 
} 

new C().func() 

产量:

class A$A150$A$A150$C$$anon$1 

你看anon$1getClass名称的结尾?这是因为在函数实例中,这个this实际上是函数类,但是我们实际上想引用this类型的C来代替。或者说,你这样做:

class C { 
    val func = new Function0[Unit] { 
    override def apply(): Unit = println(C.this.getClass) 
    } 
} 

new C().func() 

产量:

class A$A152$A$A152$C 

通知之C末,而不是anon$1

+1

感谢@ yuval-itzchakov的有用答案.. – Tom