Java 8デフォルトメソッド解説:インターフェース拡張と後方互換性
Java 8では、インターフェースにデフォルトメソッド実装の新しい概念が導入されました。この機能は後方互換性のために追加され、古いインターフェースでJava 8のラムダ式機能を活用できるようになりました。
例えば、ListやCollectionインターフェースにはforEachメソッド宣言がありません。このようなメソッドを単純に追加すると、コレクションフレームワークの実装が単純に壊れてしまいます。Java 8ではデフォルトメソッドを導入し、List/CollectionインターフェースがforEachメソッドのデフォルト実装を持てるようにし、これらのインターフェースを実装するクラスが同じメソッドを実装する必要がなくなりました。
構文
public interface Vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
複数のデフォルトメソッド衝突の解決
デフォルトメソッドを持つインターフェースを複数実装する場合、同名デフォルトメソッドの衝突が発生する可能性があります。解決方法は2つあります。
解決策1:独自メソッドでオーバーライド
public interface Vehicle {
default void print() { System.out.println("I am a vehicle!"); }
}
public interface FourWheeler {
default void print() { System.out.println("I am a four wheeler!"); }
}
public class Car implements Vehicle, FourWheeler {
public void print() {
System.out.println("I am a four wheeler car vehicle!");
}
}
解決策2:superで特定インターフェースのデフォルトメソッド呼び出し
public class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
}
}
Staticデフォルトメソッド
Java 8以降、インターフェースにstaticヘルパーメソッドも定義可能です。
public interface Vehicle {
default void print() { System.out.println("I am a vehicle!"); }
static void blowHorn() { System.out.println("Blowing horn!!!"); }
}
デフォルトメソッド完全例
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() { System.out.println("I am a vehicle!"); }
static void blowHorn() { System.out.println("Blowing horn!!!"); }
}
interface FourWheeler {
default void print() { System.out.println("I am a four wheeler!"); }
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("I am a car!");
}
}
実行結果
I am a vehicle! I am a four wheeler! Blowing horn!!! I am a car!
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Java抽象クラスとメソッド:包括的ガイド
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java String toLowerCase() & toUpperCase():ロケール対応テキストケース変換