なぜJavaでMapインタフェースのget関数パラメータがObjectなのか

1363 ワード

文章は自分の実際の開発プロジェクトで遭遇した問題に由来している.最初は定義しました
Map map;

これは問題を説明していないので、下に関数を書き始めました.N番目の関数を書いたとき、このmapを変更する必要があることに気づきました.
Map map;

修正が終わった後、私はideがすべての修正が必要な場所を検査してくれると思っていました.私はリストされた赤い線に従って、入力パラメータのタイプを一つ一つ修正すればいいと思っていました.そこで、間違いなく、私のプログラムは最後にこの場所に負けました.
map.get(someIntegerParam);

修正プログラムの問題は一方で、もっと重要なのは、なぜこのget関数がこんなに特別なのか、なぜputのようにモデルをパラメータにしないのか!?Googleでは、stackoverflowでも多くの人がこの質問をしたことがありますが、その中でこの記事のほうがいいです.大体の意味は、getのパラメータとしてモデルを採用すればmapの精神をよく体現できません.keyが等しいかどうかは、key1.equals(key2)が成立するかどうかにかかっているので、ここではタイプを制限するべきではありません.sofの別の文章でもこの問題を述べ,Josh Blochの一節を引用した.
Josh Bloch says (6:41) that they attempted to generify the get method of Map, remove method and some other, but "it simply didn't work". There are too many reasonable programs that could not be generified if you only allow the generic type of the collection as parameter type. The example given by him is an intersection of a List of Numbers and a List of Longs.
私たちはgetの方法をモデル化しようとしたことがありますが、それは掛けられています.多くの原因で彼がモデル化されないことがあります.例えば、Listをkeyにしたいのですが、Listgetにしたいと思っています.