なぜJavaでMapインタフェースのget関数パラメータがObjectなのか
1363 ワード
文章は自分の実際の開発プロジェクトで遭遇した問題に由来している.最初は定義しました
これは問題を説明していないので、下に関数を書き始めました.N番目の関数を書いたとき、この
修正が終わった後、私はideがすべての修正が必要な場所を検査してくれると思っていました.私はリストされた赤い線に従って、入力パラメータのタイプを一つ一つ修正すればいいと思っていました.そこで、間違いなく、私のプログラムは最後にこの場所に負けました.
修正プログラムの問題は一方で、もっと重要なのは、なぜこの
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.
私たちは
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にしたいのですが、List
をget
にしたいと思っています.