Java defaultキーワード

2002 ワード

Collectionインタフェースのソースコードを検討すると、CollectionインタフェースはIterableインタフェースを継承し、defaultキーワードを使用していることがわかります.
defaultキーワード
defaultメソッドはjava 8に導入されたキーワードであり、Virtual extension methods--仮想拡張メソッドとも呼ばれる.インタフェースの内部には、Javaの以前のバージョンのインタフェースに対する構文の制限を破るいくつかのデフォルトのメソッド実装(すなわち、インタフェースにメソッドボディを含めることができる)が含まれており、インタフェースが拡張されると、インタフェースに関連する実装クラスコードが破壊されないことを意味します.
Iterableインタフェースには、iterator()、forEach(Consumer super T>action)、spliterator()の3つの方法があります.2番目と3番目の方法はdefaultキーワード修飾を使用します.
    default void forEach(Consumer super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
    default Spliterator spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
以上の2つの方法はdefaultキーワード修飾を採用し、インタフェースで直接方法の実現を実現した.さらにdefaultメソッドを含むインタフェースを実装する場合、インタフェースのdefaultメソッドを直接使用するか、実装クラスでインタフェースのdefaultメソッドを書き換えて独自のメソッドを実装することができます.
例:
    interface I1 {
        void test1();
        void test2();

        default void test3(){
            System.out.println("sss1");
        }
    }

    interface I2 extends I1 {

        @Override
        default void test3(){
            System.out.println("sss2");
        }
    }

    class C2 implements I1, I2{


        @Override
        public void test1() {

        }

        @Override
        public void test2() {

        }

        @Override
        public void test3() {
            System.out.println("sss3");
        }

    }

Collectionインタフェースでは、CollectionインタフェースがIterableインタフェースを継承するとともに書き換えられます.
Iterableインタフェースのiterator()メソッドとdefault Spliterator spliterator()メソッド.(ここで筆者が疑問に思うのは、Iterableインタフェースを継承している以上、なぜIterableインタフェースのiterator()メソッドを書き換えるのか、注釈が異なり、人々に異なる理解を与える以外に、他の用途があるのかということです.コレクションインタフェースには、SetインタフェースがCollectionインタフェースを継承すると同時に、size()などの多くのCollectionインタフェースの既存の方法を書き換えるなど、多くの類似のシナリオがあります.既存のインタフェースを変更しない(増やしないだけ)目的ですか?コメントをお願いします.