Java 8 では、インターフェースにデフォルトメソッドという、中身を実装したメソッドを定義することができるようになった。抽象クラスというものがあるのに、なぜインターフェースに実装を含ませるのか、という気がしないでもないけど。
デフォルトメソッドを使ってみるサンプルコード。せっかくなので、同じメソッド名 doXXX を用意して、インターフェースを多重継承させて衝突させてみる。
public class DefaultMethods{
public interface Foo{
default void doFoo(){System.out.println("Foo::doFoo");}
default void doXXX(){System.out.println("Foo::doXXX");}
}
public interface Bar{
default void doBar(){System.out.println("Bar::doBar");}
default void doXXX(){System.out.println("Bar::doXXX");}
}
public static class Hoge implements Foo, Bar{
// インターフェースのメソッド名が衝突する場合は
// 実装クラス側でオーバーライドする必要がある
public void doXXX(){
// インターフェース名.super.メソッド名で、
// 指定したインターフェースのメソッドを呼び出せる
Foo.super.doXXX();
}
}
public static void main(String[] args){
Hoge hoge = new Hoge();
hoge.doFoo();
hoge.doBar();
hoge.doXXX();
}
}
実行結果。
$ java DefaultMethods
Foo::doFoo
Bar::doBar
Foo::doXXX
-
ref.
- Default Methods (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)
- Java による関数型プログラミング Java 8 ラムダ式と Stream (Book_Functional_Programming_in_Java - MemoWiki) ← 参考書籍。菱形継承問題 (diamond problem) とか。
tags: java
Posted by NI-Lab. (@nilab)