2016-08-29 14 views
0

インターフェイスの静的メソッド内でデフォルトメソッドを呼び出す必要があります(同じインターフェイスの2つのメソッド - 1つはデフォルトで、もう1つは静的です)。これは可能ですか?もしそうなら、どうしたらいいですか?より良い私の質問を理解するためのコード部分でインターフェイスの静的メソッド内でデフォルトメソッドを呼び出す

ルック:

interface A{ 
default void callee(){ 
     //do something here 
    } 

    static void caller(){ 
     //call callee() method anyhow 
    } 
} 
+0

はあなたのコードを表示し、あなたが持っている具体的な問題に何言って下さい。 – AlexR

+2

インスタンスメソッドを呼び出す必要があるときに、静的メソッドを静的にする必要があるのはなぜですか。動作が状態に依存する場合、おそらく静的ではありません。 – Fildor

+2

私は 'static void caller(A a){a.callee(); } 'しかし、私はそれがあなたが探しているものだとは思わない。そして、個人的には、私はそれをインスタンスメソッドにしたいと思っています。 void型の戻り値型の場合、私はそれがあるインスタンスの状態を変更すると仮定します。とにかくインスタンスが必要です。私は何とかこれがx-y-Problemかもしれないと思っています。あなたは何をしようとしているのですか? – Fildor

答えて

3

あなたは非静的メソッドを呼び出すためにインスタンスを必要としています。

static void caller() { 
    new A(){}.callee(); 
} 

静的ではない呼び出しを避ける方が良いです。静的メソッドにcalleeの部分を取り出せると思います。

+0

ありがとうございました@Sergey Rybalkin –

2

デフォルトメソッドは、インターフェイスを実装するすべてのクラスによって継承されるメソッドです。これにより、インタフェースを実装するすべてのクラスのメソッドを書き換える必要がなくなります。 'A'インターフェイスを実装しているクラスのオブジェクトインスタンスを使用して、callee 'A'からのみデフォルトメソッドを呼び出すことができます。

あなたは2つのオプションがあります:

  1. は、静的な「呼び出し側のメソッドにパラメータとしてA-オブジェクトを渡します。

    interface A { 
        default void callee(){ 
         //do something here 
        } 
    
        static void caller(A anAInstance){ 
         anAInstance.callee(); 
        } 
    } 
    
  2. このメソッド内で匿名クラスを作成します。

    interface A { 
        default void callee(){ 
         //do something here 
        } 
    
        static void caller(){ 
         new A(){}.callee(); 
        } 
    } 
    

デフォルトの方法の詳細については以下を参照してくださいhttps://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

関連する問題