マーカーインターフェイスの原則はメソッドを持たないため、できないと思いますが、デフォルトのメソッドは抽象的ではないため、わかりません。
4 に答える
マーカー インターフェイスはデフォルト メソッドを持つことができますが、それらを持つことは無意味です。
マーカー インターフェイスは、従来のインターフェイスとは使用方法が異なります。従来のインターフェースは、abstract と default の両方のメソッドを定義します。したがって、プログラムがそのインターフェイスをその型として持つ変数を宣言し、そのインターフェイス型の参照を通じて両方の種類のメソッドを呼び出すことは賢明です。
対照的に、マーカー インターフェイスはメソッドの呼び出しには使用されません。これは、型システムを通じて宣言されたオブジェクトに関するメタ情報の一部です。通常、instanceof
式を介してコードを呼び出すか、場合によってはClass.isAssignableFrom()
. 型がマーカー インターフェイスである変数を宣言しても意味がありません。そのような変数でできることは何もないからです。
JDK のマーカー インターフェイスの例は、、、Cloneable
およびRandomAccess
ですSerializable
。
ここで、いくつかのマーカー インターフェイスにデフォルト メソッドを追加することを検討してください。
interface Marker {
default void foo() { ... }
}
のデフォルトの実装では何ができますfoo
か?
デフォルト メソッドの実装は、通常、 で操作する必要がthis
あり、 で他のインスタンス メソッドを呼び出すことによって実行しますthis
。他の既定のメソッドを呼び出すこともできますが、互いに呼び出す多数の既定のメソッドを持つことは役に立ちません。最終的には、なんらかの実際の操作を実行するthis
必要があります。インターフェイス メソッドは状態 (フィールド) にアクセスできないため、実際の操作はすべて、実装クラスに存在する抽象メソッドの実装によって実行する必要があります。ただし、マーカー インターフェイスにはそのようなメソッドはありません。
のデフォルトの実装でfoo
は、このインターフェイスまたは他のクラスで静的メソッドを呼び出すことができます。このようなメソッドはおそらく最初に静的メソッドとして表現する方が適切であるため、これはほとんど無意味です。実装は静的メソッドに渡すことができthis
ますが、そのメソッドにはメソッドがないため、そのような参照では何も役に立ちません! まあ、それはデフォルトのメソッドを持っているかもしれませんが、今は輪になっていきます.
デフォルト メソッドがインターフェイスで役立つようにするには、そのインターフェイスにも抽象メソッドが必要です。ただし、抽象メソッドがある場合は、マーカー インターフェイスではなくなります。したがって、マーカー インターフェイスにデフォルト メソッドを設定するのは無意味です。