Map.get(Object key) が (完全に) ジェネリックではない理由は何ですか? 質問する

Map.get(Object key) が (完全に) ジェネリックではない理由は何ですか? 質問する

のインターフェースに完全に汎用的なgetメソッドを持たないという決定の背後にある理由は何ですか?java.util.Map<K, V>

質問を明確にするために、メソッドのシグネチャは

V get(Object key)

の代わりに

V get(K key)

そして、私はなぜなのか疑問に思っています( についても同様ですremove, containsKey, containsValue)。

ベストアンサー1

他の人が述べているように、get()などが汎用的でない理由は、取得するエントリのキーが に渡すオブジェクトと同じ型である必要がないためです。 メソッドの仕様では、それらが等しいことだけが要求されています。 これは、メソッドがオブジェクトと同じ型だけでなく、オブジェクトをパラメータとして受け取るget()方法に由来します。equals()

equals()多くのクラスが を定義して、そのオブジェクトがそのクラスのオブジェクトとのみ等しくなるようにしているのは一般的に正しいかもしれませんが、Java ではそうではない箇所が数多くあります。たとえば、 の仕様でList.equals()は、2 つの List オブジェクトは、 の異なる実装であっても、両方とも List であり、同じ内容を持つ場合は等しくなりますList。したがって、この質問の例に戻ると、 メソッドの仕様によれば、 を持ち、 を引数として を呼び出すことが可能であり、Map<ArrayList, Something>同じ内容のリストであるキーを取得する必要があります。 がジェネリックで、引数の型が制限されている場合は、これは不可能です。get()LinkedListget()

おすすめ記事