インターフェイスはJavaの複数のインターフェイスを拡張できますか?このコードは私のIDEで有効に見え、コンパイルします:
interface Foo extends Runnable, Set, Comparator<String> { }
しかし、Javaでは多重継承が許可されていないと聞いていました。インターフェイスに例外があるように見えるのはなぜですか?
はい、できます。インターフェイスは、次に示すように、複数のインターフェイスを拡張できます。
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
インターフェイスは複数のインターフェイスの拡張が可能です。
クラスは複数のインターフェースを実装が可能です。
ただし、クラスは単一クラスの拡張のみ可能です。
extends
とimplements
について話すときは、interface
とclass
の使用方法に注意してください。
インターフェイスはJavaの複数のインターフェイスを拡張できますか?
答えは:はい
JLS による
インターフェイスは、1つまたは複数の他のインターフェイスの直接の拡張であると宣言できます。つまり、非表示にできるメンバータイプと定数を除き、拡張するインターフェイスのすべてのメンバータイプ、抽象メソッド、および定数を暗黙的に指定します。
複数のInterfaces
を拡張できますが、複数のclasses
を拡張することはできません。
Javaで複数のクラスを拡張することができない理由は、これが可能なC++の悪い経験です。
複数の継承の代替は、クラスが複数のインターフェイスを実装できることです(または、インターフェイスが複数のインターフェイスを拡張できます)。
Javaクラスは、1つの親クラスのみを拡張できます。多重継承は許可されていません。ただし、インターフェイスはクラスではなく、インターフェイスは複数の親インターフェイスを拡張できます。
たとえば、こちらをご覧ください: http://www.tutorialspoint.com/Java/java_interfaces.htm
多重継承タイプに関するOracleドキュメントページから、正確な答え here を見つけることができます。ここでは、Javaの多重継承のタイプを最初に知る必要があります。
Javaは「状態の多重継承をサポートしていませんが、Java 8リリース以降のデフォルトのメソッドとインターフェースを持つ型の多重継承から実装の多重継承をサポートしています。
次に、ここで「ダイヤモンドの問題」とそれに対するJavaの対処方法に関する質問が発生します。
実装の多重継承の場合、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();
}
}
結論として、Javaはサポートしない状態の多重継承しかし、それはサポートします実装の多重継承とタイプの多重継承。
あなたの混乱は多重継承にあると思います。多重継承ではそうするのは悪い習慣であり、Javaではこれも不可能です。ただし、Javaでは複数のインターフェースの実装が許可されており、安全です。