コード怒鳴るがコンパイルに失敗した理由のJava 8、与えられましたか?
interface Father {
static void method() { }
}
interface Mother {
default void method() { }
}
interface Child extends Father, Mother {
static void method() { }
}
子供インタフェースが定義したときに、なぜ私の理解ごとに、各静的メソッドは、それゆえ、その特定のクラスに属しているstatic void method() { }
コンパイラは次のエラーを与えますか?
母オーバーライドメソッドの方法に子衝突における方法は、()()静的です
Father.method()とChild.method():子のような、独自の静的メソッドで、父と子を可能にしながら、母親からデフォルトのメソッドの実装を保つべきではないでしょうか。
Father
以来、問題はここではないインターフェイスから静的メソッドがされ継承されていない(例えばList.of(..)
介して呼び出すことができないArrayList.of(..)
ので、また、何の衝突を意味しないオーバーライド/隠蔽されていません)。
そのため、我々は安全に書くことができるというの
interface Father {
static void method() { }
}
interface Child extends Father {
static void method() { }
}
問題があるdefault void method() { }
から、法Mother
に継承されているインタフェースChild
その後を意味しています
interface Child extends Father, Mother {
static void method() { }
}
次の2つのだろうインターフェイスで終わるでしょうmethod()
バージョンを:静的および非静的(デフォルト)
interface Child extends Father, Mother {
static void method() { }
default void method() { } //inherited from Mother
}
しかし、なぜそれが問題でしょうか?
あなたが別のメソッドを追加したいと想像Child
呼び出すインターフェースmethod()
interface Child extends Father, Mother {
static void method() { }
default void method() { } //inherited from Mother
default void demo(){
method(); //which code block should be executed?
}
}
それはからコードを実行する必要があり、静的な()またはからメソッドをデフォルト()メソッド?コンパイラが決定することはできません。
このような状況では使用することによって解決することができるが
Child.method()
静的メソッドのために、this.method()
デフォルトメソッドの(静的メソッドは、そのクラスによって継承されないので、はい、それは曖昧でwound'tthis
インスタンスになります)、
ポイントは、最初の場所でこのような問題を防ぐためです。我々は一つの場所(定義または継承された)に(名前+たparameterTypes)を静的と同じシグネチャを持つ非静的メソッドを持っていないことが要求される理由です。