2011-10-19 14 views
7

私はMap<V,K>Collection<V>インターフェースを1つのクラスに実装していますが、両方のインターフェースでremove(Object)メソッドが発生します。戻り値の型は異なります。返される値はbooleanで、もう1つはVですが、それは問題ではないようです。Javaは2つのインターフェースをオーバーライドしてメソッド名をオーバーライドします

が実際に上書きされているメソッドのJava/Eclipseを伝えるいくつかの方法はありますか?

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

+0

あなたは何をしようとしているのでしょうか。 'Map'は基本的にキー値辞書です。 'コレクション'はちょっとしたものです。概念的には全く同じものではありません。 *キー*に 'Collection'としてアクセスできる' Map'がほしいと思っていますか? 'keySet()'はそれを行うためです。 –

答えて

8

いいえ、直接的な方法はありません。 Javaコンパイラは、同じシグネチャが異なる戻り値の型を持つ同じクラスの2つの方法を受け入れることができないので、結合実はダイナミック

は返すタイプを除くアカウントに署名を取ります。 2つのメソッドが同じ名前と同じパラメータを持つ場合、同じ戻り値の型を持たなければなりません(残念ながらあなたのために)。

唯一の方法は、2つの異なるクラスでビヘイビアを分割し、それらを合成することです。たぶんCollection<V> asCollection()なんかのような方法かもしれません。

+0

メソッド署名に関するJLSのドキュメントは次のとおりです。http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2 – rit

1

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

あなたは2つのインタフェースのうち少なくとも一つの継承の代わりにcompositiondelegationを使用することを検討すべきである、またはあなたが二つのクラスにあなたのクラスの機能を分割することができ、それが本当にあなたの具体的な問題に依存します。

+0

MapクラスでCollectionクラスを拡張し、Collectionクラスでremoveメソッドfinalを設定すると、Mapクラスでエラーが発生します。または、私はどのように構成を使用する必要がありますか? –

+0

"Map class extends Collection"を継承を使用しているとします。あなたがやろうとしているのは基本的にいくつかのカスタムの違いを持つマップで、Mapだけを拡張するようにしてください。また、ある機能のためにCollectionが内部的に必要な場合、そのコレクションをプライベート変数として宣言し、必要に応じて、委任を使用して必要なメソッドprivate変数の同様のメソッドで呼び出しを渡すだけのメソッドを定義します。 – stivlo

+0

ありがとう、私はそれを得るが、私がクラスを委任することを使用するとき、実際のコレクションの外観を失う。アプリケーションがいくつかのtoCollection()メソッドを呼び出すことを心配することなく、この実装を使用するのは簡単です。しかし、これは不可能と思われる。 –

1

MapはすでにキーのコレクションであるkeySet()を持っています。なぜコレクションも必要なのですか?そうなら、異なるタイプを返すasMapasCollectonの2つのメソッドを実行してください。

+0

私はカスタムのadd()メソッドを記述しています地図。 –

+0

そして?あなたはいつもあなたのオブジェクトの.asMap()。add(.. custom ..)を実行できます。 – kan

0

おそらく構図代わりの継承を必要とします。残念なことにJavaには言語レベルのサポートはありません。これはできますが、不必要に面倒です。

0

デザインを再考する必要があります。基本的に、地図はコレクションとは異なります。 Collection.add()メソッドについて考えてみましょう。地図に値のないキーやキーがないオブジェクトを追加するのは意味がありますか?

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

+0

私の編集を見て、値からキーを取得するためのメソッドを提供するインターフェイスがあります。私は何をしたいのか知っていますが、唯一の質問はどのように:-) –

+0

'add'は単なる例でした。私のコメントが立っています。 – JeremyP

関連する問題