web-dev-qa-db-ja.com

インターフェイスはJavaの複数のインターフェイスを拡張できますか?

インターフェイスはJavaの複数のインターフェイスを拡張できますか?このコードは私のIDEで有効に見え、コンパイルします:

interface Foo extends Runnable, Set, Comparator<String> { }

しかし、Javaでは多重継承が許可されていないと聞いていました。インターフェイスに例外があるように見えるのはなぜですか?

116
Prateek

はい、できます。インターフェイスは、次に示すように、複数のインターフェイスを拡張できます。

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

1つのクラスで複数のインターフェイスを実装することもできます。 2つのインターフェイスに同じ名前と署名を定義するメソッドがある場合はどうなりますか?

トリッキーなポイントがあります:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

その後、両方に対して単一の実装が機能します:)。

ここで私の完全な投稿を読んでください:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html

157
Suresh Atta

インターフェイス複数のインターフェイスの拡張が可能です。

クラス複数のインターフェースを実装が可能です。

ただし、クラス単一クラスの拡張のみ可能です。

extendsimplementsについて話すときは、interfaceclassの使用方法に注意してください。

インターフェイスはJavaの複数のインターフェイスを拡張できますか?

答えは:はい

JLS による

インターフェイスは、1つまたは複数の他のインターフェイスの直接の拡張であると宣言できます。つまり、非表示にできるメンバータイプと定数を除き、拡張するインターフェイスのすべてのメンバータイプ、抽象メソッド、および定数を暗黙的に指定します。

8
Masudul

複数のInterfacesを拡張できますが、複数のclassesを拡張することはできません。

Javaで複数のクラスを拡張することができない理由は、これが可能なC++の悪い経験です。

複数の継承の代替は、クラスが複数のインターフェイスを実装できることです(または、インターフェイスが複数のインターフェイスを拡張できます)。

3
AlexWien

Javaクラスは、1つの親クラスのみを拡張できます。多重継承は許可されていません。ただし、インターフェイスはクラスではなく、インターフェイスは複数の親インターフェイスを拡張できます。

たとえば、こちらをご覧ください: http://www.tutorialspoint.com/Java/java_interfaces.htm

2
Hoang Ong

多重継承タイプに関するOracleドキュメントページから、正確な答え here を見つけることができます。ここでは、Javaの多重継承のタイプを最初に知る必要があります。

  1. 状態の多重継承。
  2. 実装の多重継承。
  3. タイプの多重継承。

Javaは「状態の多重継承をサポートしていませんが、Java 8リリース以降のデフォルトのメソッドとインターフェースを持つ型の多重継承から実装の多重継承をサポートしています。

次に、ここで「ダイヤモンドの問題」とそれに対するJavaの対処方法に関する質問が発生します。

  1. 実装の多重継承の場合、Javaコンパイラーはコンパイルエラーを出し、インターフェース名を指定して修正するようユーザーに要求します。ここに例:-

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }
    

したがって、次のようにエラーが発生します:-インターフェイスDは、タイプBおよびCからmethod()の無関係なデフォルトを継承しますインターフェイスDは、B、Cを拡張します

次のように修正できます:-

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. タイプJavaの多重継承では、インターフェースに変更可能なフィールドが含まれず、1つの実装のみがクラスに属するため、Javaは問題を与えず、そうする。

結論として、Javaはサポートしない状態の多重継承しかし、それはサポートします実装の多重継承とタイプの多重継承

2

あなたの混乱は多重継承にあると思います。多重継承ではそうするのは悪い習慣であり、Javaではこれも不可能です。ただし、Javaでは複数のインターフェースの実装が許可されており、安全です。

1
Cem Sultan