7

Map<V,K>Collection<V>インターフェイスを1つのクラスに実装していますが、remove(Object)メソッドは両方のインターフェイスで発生するため、eclipseでいくつかのエラーが表示されます。返品の種類は異なります。1つは返品booleanで、もう1つは返品Vですが、それは問題ではないようです。

どのメソッドが実際にオーバーライドされているかをjava/eclipseに伝える方法はありますか?

編集:私はすべての値が実装しなければならないインターフェースを持っています、それはgetKey()メソッドで値を提供し、マップの追加関数を書くことを可能にします。しかし、この1つのクラスをマップとコレクションとして同時に表示する方法はないようです。

4

5 に答える 5

8

いいえ、直接的な方法はありません。

実際、動的バインディングでは、戻り値の型を除くシグネチャが考慮されるため、Java コンパイラは、シグネチャが同じで戻り値の型が異なる同じクラスの 2 つのメソッドを受け入れることができません。2 つのメソッドが同じ名前と同じパラメーターを持っている場合、残念ながら同じ戻り値の型を持っている必要があります。

唯一の方法は、動作を 2 つの異なるクラスに分割し、それらを構成することです。たぶん、そのような方法Collection<V> asCollection()か何か。

于 2011-10-19T09:19:10.913 に答える
1

いいえ、そのような競合を解決する方法はありません。

2 つのインターフェースの少なくとも 1 つで、継承の代わりに構成委譲を使用することを検討する必要があります。または、クラスの機能を 2 つのクラスに分割することもできます。実際には、具体的な問題によって異なります。

于 2011-10-19T09:15:57.963 に答える
1

キーのコレクションはMapすでに持っています。keySet()なぜコレクションも必要なのですか?その場合は、 と のように、異なる型を返す 2 つのメソッドを実行するだけasMapですasCollecton

于 2011-10-19T09:20:35.523 に答える
0

おそらく、継承ではなく構成が必要です。残念ながら、Java にはそれに対する言語レベルのサポートがありません。つまり、それは可能ですが、不必要に面倒です。

于 2011-10-19T09:29:29.003 に答える
0

設計を再考する必要があります。基本的に、マップはコレクションとは異なります。Collection.add() メソッドについて考えてみてください。キーのないオブジェクトまたは値のないキーをマップに追加することは意味がありますか?

あなたの最善の策は(アプリケーションに応じて)マップを実装することですが、コレクションが必要な場合は、そのメソッドの1つを使用してキー、値、またはキーと値のペアのセットを取得します。

于 2011-10-19T09:35:28.577 に答える