2016-01-10 17 views
8

のJava-8インターフェイス内部静的メソッドを定義することができ、しかしrestrictsそれだけインタフェース名で呼び出し:不正静的インタフェースメソッド呼び出し

9.4: An interface can declare static methods, which are invoked without reference to a particular object.

例:

interface X { 
    static void y() { 
    } 
} 

... 

X x = new X() {}; 
x.y(); 

にエラーが発生:

error: illegal static interface method call 
     x.y(); 
      ^
    the receiver expression should be replaced with the type qualifier 'X' 

多くの場合、JLSではこの種の禁止が説明されています。この場合、私は詳細なものは見つけられませんでした。だから、私はこのルールの包括的または正式な説明を探しています:なぜ特定のオブジェクト参照を介して静的メソッドを呼び出すことは禁じられていますか?何が壊れますか?

+14

最初にオブジェクト参照で静的メソッドを呼び出すことができる理由は... –

+1

その上に、上の行にあるインターフェイスXのインスタンスを取得するにはどうしたらいいですか? – aiguy

+2

は@SkinnyJに完全に同意します。私は、Java開発者が、そのインターフェイスを実装する匿名クラスを作成することによって、オブジェクトによって静的なavalaibleをいくらか混乱させて、間違いを訂正しようとしていると思っています( – silentprogrammer

答えて

16

クラスの静的メソッドではなく、変更が間に合わなかったことを認識した時点で、問題の構文が許可されてはならないということはかなり合意されています。最近追加されたインターフェイスメソッドには遅すぎることはありませんでした。

さらに、この構文を許可すると、クラスが衝突メソッドを定義するインターフェイスを実装できるため、ダイヤモンドの問題が発生する可能性があります。

+8

この分析は正しいです。インスタンスを通じて静的メソッドを呼び出す機能を言語設計のエラーとみなします。残念ながら、クラスに対して遡及的に修正することはできません。私たちは少なくとも同じ誤りを犯すことはできません。 (時々、私たちは、地域の改善よりも一貫性を選択して、意図的に「同じミスをする」ことを選択しますが、その選択には「よく、改善はどれくらい良いのですか」という判断が必要です。十分に。) –

+1

@Brian Goetz:...新しい 'static'インターフェースメソッドが以前に呼び出されたインスタンスメソッドよりも具体的であることが判明した場合、既存のコード(一度再コンパイルされたもの)を破壊する可能性があります。私は、これが(静的な)インタフェースメソッドを継承しない理由(の1つ)であると考えています。インタフェースの進化は、可能な既存の実装に与える影響を最小限に抑える必要があります。 – Holger

+1

@Holger ...さらに、デフォルトと継承可能な統計を同時に導入すると、さらに混乱が起こるでしょう。この行をここに描く理由はたくさんあります。 –

関連する問題