2016-09-18 3 views
3

私はJava 8のデフォルトメソッドについて読んでいましたが、1つのことに固執しました - それを実装せずにインターフェイスからデフォルトメソッドを呼び出す方法や動的プロキシを使用する方法がありますか?次の方法のように、単純な方法を使用することにより:リフレクションと動的プロキシを使用せずに、明示的にデフォルトメソッドを明示的に呼び出す方法はありますか?

interface DefaultTestInterface{ 
    default void method1(){ 
     //default method 
    } 
} 
class ImplementingClass implements DefaultTestInterface{ 
    public void method1(){ 
     //default method invocation in implementing method 
     DefaultTestInterface.super.method1(); 
    } 
    void method2(){ 
     //default method invocation in implementing class 
     DefaultTestInterface.super.method1(); 
    } 
} 
public class Main { 
    public static void main(String[] args) { 
     //is there any way to simply invoke default method without using proxy and reflection? 
    } 
} 

を私は同様の質問を読んで、しかしfirstは実装方法でのみ呼び出しを接続して、残りの2つはdynamic Proxy using reflection reflectionに接続されていました。

これらのソリューションは非常に複雑で、簡単な方法があれば迷っています。私はそれらの記事も読んでいましたが、私の問題の解決策は見つかりませんでした。私はどんな助けにも感謝しています。

+4

したがってインスタンスなしでインスタンスメソッドを使用したいですか? – fabian

+1

ご質問には多少の混乱があります。 Java 8インターフェースの* defaultメソッド*はすでに実装されています。別の実装が必要なクラス固有の動作がない場合は、デフォルトとして使用するメソッドを省略してインタフェースを実装するだけです。代わりに* static *キーワードを使用してメソッドを定義する*インタフェース*からメソッドを呼び出す場合。 –

+0

いいえ@ fabian、私は何とかインスタンス化されたソリューションについて考えていました。 –

答えて

6

インタフェースは、唯一の方法を持っている、またはそのすべてのメソッドは、デフォルトの実装を持って、すべてを行う必要があなたが呼び出したいメソッドを実装しません匿名の実装作成されている場合:

(new DefaultTestInterface() {}).method1(); 

Demo.

+0

ありがとう、これはまさに私が探していた解決策です。 –

+0

@MichałSzewczyk:あなたの質問に「実装しないで*」と明記されています。この回答は*実装しています。それは単に意味をなさない。それは実際に「どのようにインターフェイスを実装するのですか?」と尋ねてきました。 – Holger

+1

@Holger技術的に、あなたは絶対に正しいです。これは*インターフェイスの実装です。しかし、この縮退された実装は実装の多くのようには見えません。実際、私自身も含めて、多くのプログラマーが単純な実装で実装を見つけることはないと確信しています。 – dasblinkenlight

関連する問題