ジャバ:この多重継承の曖昧さを何と呼びますか?
-
20-09-2019 - |
質問
以下は Java で複数のインターフェース継承を使用する例ですが、問題があります。
なぜ問題が発生するのかは十分に承知しており、これが私の質問の主旨ではないことに注意してください。問題は、この特定の複数インターフェイス継承の曖昧さに名前がある場合、どのように名前を付けるかということです。
たとえば、C++ では、複数の実装継承を使用し、どのオーバーライド メソッドを使用するかを決定できないときに生じるあいまいさは、「ダイヤモンド問題」と呼ばれます。
http://en.wikipedia.org/wiki/Diamond_problem
もう一度言いますが、これは同じ問題ではありません。それは問題ではありません。重要なのは、前のケースでは名前が造られたということです。
そして、これから説明する問題に名前が存在するかどうか知りたいです。
次に、別の種類の多重継承の例を示します。ここでは、1 つのインターフェイスが、互換性のないメソッドの戻り値の型を持つ他の 2 つのインターフェイスから継承します。
interface A {
void a();
Integer c();
}
interface B {
void b();
Long c();
}
interface MI extends A, B {...}
(「extends」キーワードを使用して複数のインターフェイスの継承が機能していることに注意してください)
次の理由により、それはできません。
タイプ A とタイプ B には互換性がありません。どちらもC()を定義しますが、無関係なリターンタイプで
その状況を説明するために名前が作られましたか?
解決
私はそれのための具体的な名前があるかわからない、あるいは少なくとも非常に一般的に使用されていないようです。それは「単なる」クラスメソッドへのインターフェイスメソッドの暗黙的なマッピングの問題です。あなたが唯一の戻り値の型が異なるオーバーロードを持つことができれば、いずれかの問題はないでしょう。だから、署名/オーバーロード/暗黙の方法マッピングの問題に帰着ます。
「Javaで考える」オンラインブックでは、どちらかそれの名前がありません。 http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001。 HTM の
ちょうど側ノート、C#がこの問題に対処しており、明示的なインタフェースの実装を可能にする。
他のヒント
JLS §6.4.4、インターフェイス型のメンバー このような重複したスーパーインターフェイス メンバーを呼び出します 曖昧な, 、コンパイル時エラーが必要です。のようなカラフルなものを期待していました ボジョレー効果, ハイゼンバグ, 他. 。多分 2人ずつ?
私もこの問題の任意の特定の名前を知りません。それは単語を含む文で説明したarisedたびに、いくつかの点での戻り値の型に互換性がないの。これは、Javaクラスライブラリでより顕著と迷惑な例の一つであるとして、あなたはまたの地図/セットincompatibilty は、それを呼び出すことができます。それは不可能地図の(オブジェクト)のコレクションとは異なる戻り値の型を持つの方法を削除を定義するという理由だけでも設定やコレクションとしてマップを実装する同じクラスを持つようになります。
public interface Collection<E> extends Iterable<E> {
boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
V remove(Object key);
}
私は、インターフェースは単に、うまくインタフェースを記述しているため、この多重継承の問題を呼び出すのをためらうだろう。他のインターフェイスとのインターフェイスを拡張することは、実際にサブインターフェイスがスーパーインターフェースから継承する意味ではなく、サブインターフェイスは、本質的に、二つに定義されたメソッドの連結であることはありません。
第3のインタフェースは、サブインターフェイスを拡張するために使用され、競合メソッド宣言が提供されている場合は、ちょうど同じインタフェースに同じ2つの競合する方法を提供したかのように、は、それが本質的に同じです。
私は覚えていません。 Java言語で仕様は、このためには名前がどちらかありませんます。
あなたが記述問題は、.NETだけでなく、Javaで存在するが、そこに簡単な解決策を持っています.NETフレームワークは、クラスが別の名前でクラスメンバを使用してインターフェイスメンバを実装することができます。したがって、戻り値の型だけが異なる2種類のインタフェースのメンバーを実装するクラスのメソッドが同じ名前を持つインターフェイスメンバを実装する能力を排除するものではない別の名前を持っている必要があります。
インタフェースが競合メンバーを持つ2つのインタフェースを継承する場合は、、複合インターフェースを実装するクラスは、それが直接競合するインタフェースを継承した場合と同様の部材を実装することができます。合わせたインターフェースの消費者は、一般的に他のインターフェイスタイプのいずれかへの参照を変換することなく、いずれかの成分インタフェースのメンバーを使用することはできませんが、問題のキャストはなくダウンキャストよりアップキャストを考える。
.NETで実装方式ではうまく動作しますが。残念ながら、Javaで似た何かをする方法はありません。私はインターフェイスが競合のメンバーと他のインタフェースを継承している場合、Javaが甲高い音になることを知りませんが、それはその時点でsquawksかどうか、それを実装することができ、クラスを生成する方法はありません。
私はいつも起きる具体的な方法となり無曖昧に一つだけの実装があるので名前は、Javaのインターフェイスは、メソッドの実装を持つことができないので、問題はそのため回避され定義されていないと思います。
私はポイントを逃したか、あなたは「C」変数について話していることがありますか?