インターフェースのデフォルトメソッド

インターフェースはデフォルトメソッドも定義できます。インターフェースstaticメソッドと同様に、デフォルトメソッドのバイトコードは、コンパイルされたクラスファイルに存在します。

デフォルトメソッドのインストルメンテーションを構成するときは、次に従います。

  • ターゲットがデフォルトメソッドをオーバーライドしないクラスである場合、対象とするインターフェイスにクラスマッチを使用する
  • ターゲットがデフォルトメソッドをオーバーライドするクラスの場合は、インターフェイスマッチを使用する

インターフェイス デフォルト メソッドを直接インストゥルメント化

以下のインターフェースの場合

package jdk8;
interface InterfaceForConcreteClassDefaultMethod
{
default int sum(int acc, int x)
{
return acc + x;
}
}

およびその実装クラス

package jdk8;
class ClassForDefaultMethod implements InterfaceForConcreteClassDefaultMethod
{
}

この例では、 はデフォルトのメソッドをオーバーライドしません。従って、インターフェースに対して以下のようにクラスマッチを使用することができます。

オーバーライドされたデフォルトメソッドのインストゥルメント化

以下のインターフェースの場合

package jdk8;
interface InterfaceForAnonymousClassDefaultMethod
{
default int sum(int acc, int x)
{
return acc + x;
}
}

結果 :

InterfaceForAnonymousClassDefaultMethod i = new InterfaceForAnonymousClassDefaultMethod()
{
@Override
public int sum(int acc, int x)
{
return acc + x;
}
};

メソッドがオーバーライドされるため、ターゲットバイトコード InterfaceForAnonymousClassDefaultMethod