2015-10-13 12 views
17

CompilingObject.clone(への機能参照)は、OracleのJDKを使用して

import java.util.concurrent.Callable; 

class Ideone 
{ 
    Callable<?> x = super::clone; 
} 

をコンパイルしません与える:

クラスは、その親の保護にアクセスすることができるはずとしても意味がありません
Main.java:6: error: incompatible types: invalid method reference 
    Callable<?> x = super::clone; 
        ^
    clone() has protected access in Object 

メソッド。この式はEclipseのコンパイラでうまく動作します。

また、() -> super.clone()は罰金コンパイル....

は、これはバグですか?

+2

'this :: clone'は機能しますか? – thecoop

+0

JDK 1.8.0_51とEclipse Mars 4.5.0でこれを再現できます。 Eclipseのバグのようです。 – Tunaki

+0

JDK 1.8.0_60とEclipse Mars – Flown

答えて

6

superは実際には表現ではなく、話す静的型はありません。 super.foo()this.foo()と同じアクセス権を持ちます。メソッド呼び出しは、 "通常の呼び出し"ではなく、 "スーパー呼び出し"のようにバイトコードで異なって変換されます。

これではJLSはあまり明確ではありません。例えばセクションのprotected accessでは、super.protectedMemberフォームは記載されていません。明らかにそのフォームはJLSで議論されるべきである。アクセス可能でなければなりません。 、言葉遣いも曖昧であるmethod referenceのセクションで

(セクションはX::mX.mが同じw.r.t.アクセス権を処理しなければならないことを示唆しません)。それにもかかわらず、super::clonesuper.clone()と同じ方法でアクセス可能でなければなりません。

バグレポートが作成されました:JDK-8139836: “Can't use super::x method reference when x is protected”。現在の状況は、Java 9で修正されるということです。

+1

保護されたアクセスのルール - http://stackoverflow.com/a/32263340/2158288 – ZhongYu

+0

(私の[コメント](#comment54031785_33107500)を参照してください))6.6.2.1は非常に正確な言語で書かれています。ケースを曖昧にする:ケースは文字通り定義されていない。しかし、このフォームは便利な 'clone()'を実装する必要があるので、それが長い間仕様に欠けているとはほとんど考えられません。 –

+1

まあ...修飾されていない 'clone()'フォームも定義されていないと言うでしょうか?多分 'this.clone()'と同等であることはよく理解されています。同様に、 'super.clone()'は、JLSの対象読者の間では、コンパイル時に 'this.clone()'と多くの点で同等であることがよく理解されています。 – ZhongYu

関連する問題