java8(JDK8)の新機能をEclipseとJUnitで[インターフェースのデフォルト実装の使い方]Java、Eclipse、JUnitに関連した技術情報のブログです。Typeの説明をさせていただきます。その流れの中で「java8の新機能」である「インターフェースのデフォルト実装」の説明をさせていただきます。Method」の省略形です。関数型インターフェースとの関係は?と思いますよね、という事で試してみました。抽象クラスで試してみる。Type」は関数型インターフェースではないです。Type」なインターフェース=関数型インターフェースです。念のため検証してみました。Expressions)の左辺に利用して確認してみました。すると、コンパイルエラーをくらってしまいました。buffer.toString());}}を使って上記の事実を検証するために以下の抽象クラスを作成しました。=”に変更してみました。するとコンパイルエラーが発生しました。interface」です。Type」は「関数型インターフェース」ではないことが分かりました。Type」がたまに使われるのではないかと考えます。デフォルト実装を持ったインターフェースで試してみるJDK8からインターフェースのデフォルト実装が可能となりました。インターフェースのデフォルト実装と@FunctionalInterfaceの関係を試してみるインターフェースのメソッドにデフォルト実装がある時に、そのインターフェースが@FunctionalInterfaceの条件に合致するかを検証してみます。Method」にデフォルト実装をしてみる。IFuncSampleのhogeメソッドにデフォルト実装をしてみました。以下は、デフォルト実装前となります。hoge();}以下が、デフォルト実装後となります。{}}デフォルト実装後は、コンパイルエラーが出ます。Type」と認識されない仕様のようです。interface・デフォルト実装をしたメソッドを追加してみる。次は、hogeメソッドはそのままにし、デフォルト実装をしたhogehogeメソッドを追加してみます。{System.out.println("hogehoge");}}コンパイルも通りましたし、テストケースも通りました。この結果から、デフォルト実装したメソッドは「SAM」TypeのSingleには加算されないことが分かりました。確かに、インターフェースのデフォルト実装が可能になったことによって独自フレームワークのクラス等を作る時の基底クラスを作る時の手間が省けます。今までは、インターフェースを実装した抽象クラス等を作成して、デフォルト実装の処理を実現するとの手法を取る必要がありましたよね。この仕様は良い事ばかりではありません。今までのJavaでは考慮しなくても良かった概念を理解し、それに起因する問題に対処しなければならなくなりました。インターフェースの実装クラスの実装時クラスAがインターフェースBとインターフェースCを実装しておりインターフェースBとインターフェースCが同一のメソッド名と引数定義のデフォルト実装を持ったメソッドを保有している時です。先ほどのIFuncSampleとhogehogeメソッドが衝突するようにIFuncExampleインターフェースを作成して、両インターフェースを実装するFuncSampleImplクラスを作成してみました。stub}}するとコンパイルエラーが発生しました。エラーメッセージの抜粋は以下の通りです。hogehogeが多重定義されていると言われました。IFuncSampleこのエラーを解消するには2つの解決策のどちらかを行う必要があります。インターフェースのどちらか一方のhogehogeメソッドの引数を変更する。FuncSampleImplでhogehogeをオーバーライドする。インターフェースのどちらか一方からhogehogeメソッドのデフォルト実装を除去することでも、本問題を解決できそうな気がしますが、以下のエラーメッセージに変わるだけです。IFuncExample今度は衝突していると言われてしまいます。結局実装クラスのhogehogeメソッドの実装が全てを解決してくれます。インターフェースの多重継承時IFuncExampleとIFuncSampleを継承するインターフェースIFuncSampleExを作成しました。(IFuncExampleとIFuncSampleはhogehogeメソッドのデフォルト実装を持っている。IFuncExample{}この状態ではコンパイルエラーの内容は以下の通りです。FuncSampleImplクラスの初めのエラーと同じです。IFuncSampleこのエラーを解消するには2つの解決策のどちらかを行う必要があります。インターフェースのどちらか一方のhogehogeメソッドの引数を変更する。IFuncSampleExでhogehogeををデフォルト実装する。インターフェースのどちらから一方からhogehogeメソッドのデフォルト実装を除去した場合もコンパイルエラーが発生します。エラーメッセージは、FuncSampleImplクラスと全く同じとなります。実装クラスまたは継承インターフェースからのデフォルト実装呼び出し前述のように、せっかくインターフェースのデフォルト実装をしても、多重定義や衝突としてコンパイラが認識してしまい、オーバーライドしないとコンパイルが通らず、デフォルト実装が使えないとの場面が想定されます。8」は、この様な場面も想定しています。FuncSampleImplクラスを例として説明させていただきます。言っても、コメントが全てです。{IFuncSample.super.hogehoge();//IFuncExampleの方を呼び出したい場合は//IFuncExample.super.hogehoge();で可能//IFuncExample.super.hogehogeにデフォルト実装が無い場合はコンパイルエラーとなる}}IFuncSample.super.hogehoge();の呼び出しは、IFuncSampleExからも同じ様に利用可能です。ちなみにですが、Eclipseのコードアシストでは、IFuncSample.と入力した後でsuperの候補が表示されませんので、手入力する必要があります。「java8(JDK8)の新機能[インターフェースのデフォルト実装]」は以上です。API」が利用できるようになりました。4.4記事を読むEclipse4.4(Java)における自動ビルド設定の変更方法の説明Eclipse4.4における自動ビルド設定の変更方法を説明させていただきます。記事を読むEclipseの使い方(Windows環境のEclipse4.3、Eclipse4.4)Eclipse4.4.0よりJDK8を正式サポートするそうです。コメントをキャンセルメールアドレスが公開されることはありません。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。JUnit5が本格的に利用できる環境が整ってきました。RSSWordPress.orgjava8(JDK8)の新機能をEclipseとJUnitで[インターフェースのデフォルト実装の使い方]Java、Eclipse、JUnitに関連した技術情報のブログです。