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


126

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

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

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


3
それは不可能だと言っている記事はどれですか?それらは間違っているか、あなたがそれらを誤解していて、インターフェースではなくクラスについて話しているかのどちらかです。

7
この質問は、自己調査で簡単に回答できるため、トピックから外れているようです
JoseK 2013年

4
@StephenC矛盾する記事を見つけた場合は、投稿する必要があります。そのように人々が...それらの記事を読むことを知らない
しかし、私はないAラッパークラスです

10
この質問への答えは私に時間を節約しました。私はそれが有効な質問として価値があると主張します。
xdhmoore 2015年

6
役立つ質問、これはIDEがいくつかの警告をスローすることを期待してこれを行いましたが、何も表示されないことに驚きました。だから私は無意識のうちにGoogleにopと同じ質問を入力して、このページにいくつかの回答/確認を付けました
Arthur

回答:


170

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

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

単一のクラスで複数のインターフェースを実装することもできます。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


@RahulBhadana抽象メソッドは正しくオーバーライドする必要がありますか?
Suresh Atta 14

13
インターフェースA void test()とインターフェースB がある場合はどうなりますboolean test()か?(これはダイアモンド問題のいとこですか?)__それを試してみて、賢明なことが起こります。戻り値の型が異なる場合は許可されません。
Daniel

@sureshatta-では何が起こるのですか?それは両方とも呼ばれますか?
Fattie

4
クラスでは、2つのメソッドが同じシグネチャで戻り値の型が異なることを許可していません。stackoverflow.com/questions/16149285/...
ニンファム

73

インターフェース複数インターフェース拡張できます

クラスができ、複数のインターフェイスを実装します

ただし、クラス1つのクラスしか拡張できません。

あなたは言葉をどのように使用するかを慎重にextendsimplementsの話をするときinterfaceclass


8

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

答えは:はい。

JLSによると

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


JLS =「Java言語仕様」は、これらの質問の信頼できる情報源です。
Hontváriレベンテ

6

多重継承タイプに関するOracleのドキュメントページから、ここで正確な答えを見つけることができます。ここで、まず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. インターフェースに可変フィールドが含まれておらず、1つの実装のみがクラスに属するため、タイプjavaの多重継承ではそれが可能です。そのため、javaは問題を発生せず、そうすることができます。

結論として、Java 状態の多重継承をサポートしていません、実装の多重継承と型の多重継承をサポートします。


1
これはより適切な答えであり、質問に対してより明確になります。+1
Ketan Joshi

@KetanJoshiに感謝します。これにより、多くのモチベーションが高まります:)
shankar upadhyay

4

複数の拡張は可能ですが、複数の拡張Interfacesはできませんclasses

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

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


2

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.