インターフェースに状態を関連付けることはできません。
抽象クラスには、状態を関連付けることができます。
さらに、インターフェイスのデフォルト メソッドを実装する必要はありません。したがって、この方法では、既存のコードが壊れることはありません。インターフェイスは更新を受け取りますが、実装クラスはそれを実装する必要がないためです。
その結果、最適ではないコードが得られる可能性がありますが、より最適なコードが必要な場合は、デフォルトの実装をオーバーライドする必要があります。
そして最後に、ひし形の問題が発生した場合、コンパイラは警告を表示し、実装するインターフェイスを選択する必要があります。
ひし形の問題について詳しく説明するには、次のコードを検討してください。
interface A {
void method();
}
interface B extends A {
@Override
default void method() {
System.out.println("B");
}
}
interface C extends A {
@Override
default void method() {
System.out.println("C");
}
}
interface D extends B, C {
}
ここで、次のコンパイラ エラーが発生しますinterface D extends B, C
。
interface D inherits unrelated defaults for method() form types B and C
修正は次のとおりです。
interface D extends B, C {
@Override
default void method() {
B.super.method();
}
}
method()
fromを継承したい場合B
。
の場合D
も同様class
です。
Java 8 でのインターフェースと抽象クラスの違いについてさらに詳しく説明するには、次のことを考慮してTeam
ください。
interface Player {
}
interface Team {
void addPlayer(Player player);
}
addPlayer
理論的には、たとえばプレーヤーのリストにプレーヤーを追加できるようなデフォルトの実装を提供できます。
ちょっと待って...?
プレイヤーのリストを保存するにはどうすればよいですか?
答えは、デフォルトの実装が利用可能であっても、インターフェイスでそれを行うことはできないということです。