2016-09-16 108 views
11

最近from this question據我瞭解,下面似乎是合法的Java:Java:使用「this」作爲實例方法的參數/參數名稱?

class Bar { 
    void foo(Bar this) {} 
} 

現在,我試圖找到其中的Java標準它說,你被允許這樣做,看着here,但我找不到該部分。

有人可以引用它允許這種形式的方法聲明以及聲明名爲this的參數的限制是什麼?

+0

這很酷。因爲我知道我試圖想出這個「JLS」背景;但我最初的懶惰嘗試失敗。感謝你,我現在知道! – GhostCat

回答

12

它適用於1.8或更高版本的JDK。

這裏是JLS saying that

接收機參數是一個實例方法或內部類的構造可選句法設備。對於實例方法,receiver參數表示調用該方法的對象。對於內部類的構造函數,receiver參數表示新構造對象的立即封閉實例。無論採用哪種方式,接收者參數都只存在於允許表示對象的類型在源代碼中表示,以便該類型可能被註釋。

如果你讀你會發現下面的小鬼註解的全部要點,

當一個接收機參數是允許的,其類型和名稱具體如下:

  • 在實例方法中,接收者參數的類型必須是聲明方法的 類或接口,並且名稱爲 接收器參數必須是這個;否則,發生編譯時錯誤 。

  • 在一個內部類的構造函數,該接收器參數 的類型必須是類或接口,其是內部類的立即封閉 類型聲明,並且接收機 參數的名稱必須是標識符。這裏標識符是簡單的 類或接口的名稱,它是立即包含內部類的 類型聲明;否則,發生編譯時錯誤 。

+0

呃......這個改變的原因是什麼?感覺沒有必要能夠命名參數'this' – Gikkman

+2

@Gikkman最後一句解釋了爲什麼:*接收器參數的存在僅僅是爲了允許表示對象的類型在源代碼中表示**,所以類型可能被註釋**。*儘管我認爲它確實意味着:使(隱含)*參數*可能被註釋。 – Andreas

+1

我讀過你的編輯5次,我仍然沒有得到它。猜猜我發現了一些東西,我需要在這裏進一步查找,謝謝:-) – Gikkman

相關問題