2011-01-13 12 views
8

可能性の重複:
What are the reasons why Map.get(Object key) is not (fully) genericjava.util.Map.get(...)が汎用ではないのはなぜですか?

この方法とMapインタフェースの他の多くの方法は、一般的なものではありません。ほとんどの場合、キー値がパラメータとして期待されるところではなく、Objectを受け取ります(remove、get、containsKey)。

なぜこの決定を下したかについての考え方。私の前提は、レガシーコードをサポートするために行われたことですが、私にとっては弱い立場にあると思います。

KeyTypeの代わりにここでObjectを受け入れることをお勧めする理由は誰にでも分かります。

+3

この質問は過去6年間に何度も聞かれました。既存の回答を検索することをお勧めします。 –

+0

remove、containsValue、containsKeyと同じです... – aioobe

答えて

8

特定のキーの検索/削除/チェックに使用されるオブジェクトは、必ずしもオブジェクトを格納するオブジェクト(=キー)と同じ型である必要はありません。

equalが必要であり、同じhashCodeをキーとして返す必要がありますが、仕様の中には同じタイプでなければならないというものはありません。

その事実はめったに使われず、同じキー(または少なくとも同じ種類のオブジェクト)を格納するために使用するものと同じ値を取得することがほとんどです。

しかし、それは "古い" HashMapでサポートされているユースケースだったので、ジェネリックスバージョンでもサポートする必要があります。

put()が呼び出されたときに、キーとして使用されるオブジェクトを正確に返すので、keySet()が特定の型を使用するすべてのメソッドに注意してください。

+0

ああ、回答ありがとうございます。それはちょっと意味があると思います。あなたはIntegersによってDoublesをキーとして使用するマッピングを検索することができると思います。 –

+0

@Kevin:IntegerとDoubleが互換性のあるequals()実装を持たないため、その特定の例は機能しません。 –