2017-07-10 82 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