Javaのインターフェースはクラスに似ていますが、インターフェースの本体には以下を含めることができます。抽象メソッドのみおよび
final
フィールド(定数)。
最近、こんな質問を見かけました
interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}
インターフェース定義によれば、抽象メソッドのみ許可されています。なぜ上記のコードをコンパイルできるのでしょうか?default
キーワードは何ですか?
一方、以下のコードを書こうとすると、modifier default not allowed here
default class MyClass{
}
の代わりに
class MyClass {
}
キーワードの目的を教えていただけますかdefault
? インターフェース内でのみ許可されますか? default
(アクセス修飾子なし) とどう違うのですか?
ベストアンサー1
これはJava 8の新機能で、interface
実装を提供することができます。Java 8で説明されていますJLS-13.5.6. インターフェースメソッド宣言(一部抜粋)
メソッドを追加したり
default
、メソッドを から に変更したりしてもabstract
、default
既存のバイナリとの互換性は損なわれませんが、IncompatibleClassChangeError
既存のバイナリが メソッドを呼び出そうとすると が発生する可能性があります。このエラーは、修飾型 がT
2 つのインターフェース および のサブタイプである場合に発生します。I
ここで、 とはJ
両方とも同じシグネチャと結果を持つメソッドを宣言しており、 も も他方のサブインターフェースではありません。I
J
default
I
J
JDK 8の新機能(一部)
デフォルト メソッドを使用すると、ライブラリのインターフェイスに新しい機能を追加し、それらのインターフェイスの古いバージョン用に記述されたコードとのバイナリ互換性を確保できます。