Java 8インタフェースが変化

4998 ワード

一、主な変化
Java 8のインタフェースにはいくつかの変化があり、具体的な変化は以下の通りです.
1.スタティックメソッドとデフォルトメソッドが提供され、staticキーとdefaultキーをそれぞれ使用して修飾されます.この2つのメソッドにはメソッドボディ(以下、注意すべき点)があります.    [1]:defaultメソッドはインスタンスに属し、staticメソッドはインタフェースまたはクラスに属する.注意すべきは、defaultメソッドは継承され、staticメソッドは継承されません.    [2]:1つのクラスが複数のインタフェースを実装し、これらのインタフェース間で相互に関係を継承していない場合、同じdefaultメソッドが存在する場合はエラーが報告されますが、実装クラスでdefaultメソッドを書き換え、.super.();形式は、どの親インタフェースでdefaultメソッドを呼び出すかを指定します.
2.1つのインタフェースに抽象的なメソッドが1つしかない場合、このインタフェースはデフォルトで自動的に関数インタフェースになります.
3.@FunctionalInterface注記を使用してインタフェースを修飾した場合、このインタフェースは関数インタフェースであり、このインタフェースには抽象的な方法(静的方法とデフォルト方法を制限しない)しかないことを示します.関数インタフェースは、Lambda式によってインタフェースのオブジェクトを作成できます.
二、簡単な例
Java 8のインタフェースに関する簡単な例を次に示します.インタフェースにはstaticメソッドとdefaultメソッドが定義されています.この2つのメソッドには独立したメソッドボディがあり、以前はインタフェースで抽象メソッドしか定義できなかったルールを破ります.
TestクラスによってTestInterfaceインタフェースが実装され、TestクラスのインスタンスはtestDefaultMethod()メソッドを呼び出すことができますが、testStaticMethod()メソッドを呼び出すことはできません.testStaticMethod()メソッドを呼び出すには、インタフェースの名前を使用して静的メソッドを直接呼び出すことができます.
public interface TestInterface {
    static void testStaticMethod(){
        System.out.println("static method run");
    }
    default void testDefaultMethod(){
        System.out.println("default method run");
    }
}

class Test implements TestInterface {
    public static void main(String[] args) {

        Test test = new Test();
        test.testDefaultMethod();
        //test.testStaticMethod();  Static method may be invoked on containing interface class only
        TestInterface.testStaticMethod();   //                     
    }
}

出力default method run static method run
クラスが2つのインタフェースを実装している場合、この2つのインタフェースの間には関係が継承されておらず、この2つのインタフェースに同じデフォルトメソッドがある場合は、両方を実装するときにデフォルトメソッドを書き直さなければなりません.書き換えメソッドで指定したインタフェースのデフォルトメソッドを呼び出すことができます.そうしないと、エラーが発生します.
public interface TestInterface {
    default void testDefaultMethod(){
        System.out.println("TestInterface default method run");
    }
}

interface TestInterface1{
    default void testDefaultMethod(){
        System.out.println("TestInterface1 default method run");
    }
}

class Test implements TestInterface,TestInterface1 {
    public void testDefaultMethod(){
        TestInterface1.super.testDefaultMethod();
    }

    public static void main(String[] args) {

        Test test = new Test();
        test.testDefaultMethod();
    }
}

出力TestInterface 1 default method run
三、関数式インタフェースの定義
関数インタフェースを定義する方法は2つあり、1つはインタフェースを定義し、そのインタフェースに抽象的な方法が1つしかない.2つ目の方法は、@FunctionalInterface注釈を使用して、インタフェースが関数インタフェースであることを宣言することです.@FunctionalInterface注釈が追加されると、インタフェースには抽象的な方法しか定義できません.定義が多いか、定義しないとエラーが発生します.
@FunctionalInterface
public interface TestFunctionalInterface {
    static void staticMethod(){}    //                     
    default void defaultMethod(){}

    void functionalInterfaceMethod();
    // void functionalInterfaceMethod2();    
}