Java8のデフォルトメソッドと複数継承

Java8のデフォルトメソッドについて。
Java 8: The Fundamentals (English Edition)』を読みながら気に入ったところを自分で動かしながら確認しているコードです。

1、インターフェースにデフォルトメソッドを記述することができるようになりました。
こんな感じ。

package io.stream.interfaces;

public interface A1Interface {
	
	public default void doSomething(){
		
		System.out.println("THis is A1 Interface doSomething default method");
	}

}

2、そしてクラスを作成するときに、インターフェースは複数継承することができるので、
つまりデフォルトメソッドを持つ複数のインターフェースを継承することができます。
ここで複数継承が可能になっています。

もう一つ同じメソッド名のデフォルトメソッドを持つインターフェースを作成する

package io.stream.interfaces;

public interface A2Interfase {

	public default void doSomething(){
		System.out.println("THis is A2 Interface doSomething default method");
	}
}

上で作成したインターフェースを2つとも継承するクラスを作成する
以下はこのままでは動かないパターン

package io.stream;

import io.stream.interfaces.A1Interface;
import io.stream.interfaces.A2Interfase;

public class ImplementMultiInterface implements A1Interface, A2Interfase {

	public static void main(String[] args) {
                //this code is warn compliation error
		ImplementMultiInterface thisclass = new ImplementMultiInterface();
		thisclass.doSomething();
	}

}

上のクラスのままだとeclipseが警告を出してきます。
doSomethingメソッドが同名なので、A1かA2のどちらを継承するのか宣言するように以下のようなメッセージが出力される。

無視してこのまま実行するとこんな感じでコンパイルエラーに

この場合、eclipseのおすすめに従い、どちらかをオーバーライドすればコンパイルエラーは解消します。

package io.stream;

import io.stream.interfaces.A1Interface;
import io.stream.interfaces.A2Interfase;

public class ImplementMultiInterface implements A1Interface, A2Interfase {

	public static void main(String[] args) {
		ImplementMultiInterface thisclass = new ImplementMultiInterface();
		thisclass.doSomething();
	}

	@Override
	public void doSomething() {
		//chose A1Interface default method 
		A1Interface.super.doSomething();
	}
}

実行すると以下の結果が出力されます。オーバーライドした方、A1Interfaceの方のメソッドを実行した結果が表示されます。

■応用
オーバーライドするメソッドは、メソッドごとに選択する事が可能なため、このメソッドはA1、このメソッドはA2と選ぶことが可能。
※但し複数のインターフェースにおいて同名のメソッドを実装する可能性があるかは不明。

ソース例は以下の通り

package io.stream.interfaces;

public interface A1Interface {
	
	public default void doSomething(){
		
		System.out.println("THis is A1 Interface doSomething default method");
	}
	
	public default void doAnotherThing(){
		System.out.println("THis is A1 Interface doAnotherThing defaultc method");
	}

}
package io.stream.interfaces;

public interface A2Interfase {

	public default void doSomething(){
		System.out.println("THis is A2 Interface doSomething default method");
	}
	
	public default void doAnotherThing(){
		System.out.println("THis is A2 Interface doAnotherThing defaultc method");
	}
}
package io.stream;

import io.stream.interfaces.A1Interface;
import io.stream.interfaces.A2Interfase;

public class ImplementMultiInterface implements A1Interface, A2Interfase {

	public static void main(String[] args) {
		ImplementMultiInterface thisclass = new ImplementMultiInterface();
		thisclass.doSomething();
		thisclass.doAnotherThing();
	}

	@Override
	public void doSomething() {
		//chose A1Interface default method 
		A1Interface.super.doSomething();
	}

	@Override
	public void doAnotherThing() {
		//chose A2Interface default method 
		A2Interfase.super.doAnotherThing();
	}

}

このクラスを実行すると以下の内容が表示される

THis is A1 Interface doSomething default method
THis is A2 Interface doAnotherThing defaultc method

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です