JavaのHashMapのget関数はget(Kkey)ではなくget(Object key)です.
他の人のコードのバグを変更して、getまたはremoveが伝達したパラメータタイプが一致しないことによってバグがたくさんあることを発見しました.
例:
上のコード出力はnullです.
一般の人は、渡されたintとShortタイプが一致していないことに気づきにくく、IDE、コンパイラにもヒントがありません.もちろんいくつかの分析ツールで検査することができます.
本当に困惑して、Javaの中の容器のいくつかの関数、パラメータはすべてObjectのタイプで、例えばHashMapの中のget、remove関数、Setの中のcontains関数.
なぜそれらのタイプを明確にしないのですか?これにより、コンパイラはタイプが一致しないエラーを検出できます.
Googleの、googleのエンジニアが答えを出しました.http://smallwig.blogspot.com/2007/12/why-does-setcontains-take-object-not-e.html
簡単にするために、Set容器を例にとります.
単純なSを定義します.単純なcontains関数は1つしかありません.
関数がある場合、Fooクラスの集合を処理します.
すべてはよく見えますが、コードを合わせると悲劇に気づきます.
このときコンパイラはやめて、仕事ができないことを示します.
Sクラスの定義では,contains(K k)関数が1つの明確なタイプのパラメータしか受け入れられないことを明らかにした.
しかしdoSomeReading関数では、コンパイラはどのタイプがFooタイプなのか、SubFooタイプなのか、SubSubFooタイプなのか、SubSubFooタイプなのかを判断できません.
コンパイラは知らないのでnullタイプのパラメータのみを許可します.
===========================================================
この解析に対して、話はやはり少し憂鬱だ.
equals関数と関係があると考える別の解析もある.しかし、あまり頼りにならない感じがします.これは別の応用としか言えません.
http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic
例:
Map m = new HashMap();
m.put(new Short((short) 2), "2222");
System.out.println(m.get(2));
上のコード出力はnullです.
一般の人は、渡されたintとShortタイプが一致していないことに気づきにくく、IDE、コンパイラにもヒントがありません.もちろんいくつかの分析ツールで検査することができます.
本当に困惑して、Javaの中の容器のいくつかの関数、パラメータはすべてObjectのタイプで、例えばHashMapの中のget、remove関数、Setの中のcontains関数.
なぜそれらのタイプを明確にしないのですか?これにより、コンパイラはタイプが一致しないエラーを検出できます.
Googleの、googleのエンジニアが答えを出しました.http://smallwig.blogspot.com/2007/12/why-does-setcontains-take-object-not-e.html
簡単にするために、Set容器を例にとります.
単純なSを定義します.単純なcontains関数は1つしかありません.
class S{
public void contains(K k){
System.out.println("S,contains(K k)");
}
}
関数がある場合、Fooクラスの集合を処理します.
public void doSomeReading(S foos) {
}
Fooクラスのサブクラス(SubFooなど)の集合を同時に処理したい場合は、次のように定義します. public void doSomeReading(S extends Foo> foos) {
}
すべてはよく見えますが、コードを合わせると悲劇に気づきます.
class S{
public void contains(K k){
System.out.println("S,contains(K k)");
}
}
class Foo{
}
class SubFoo extends Foo{
}
public void doSomeReading(S extends Foo> foos) {
Foo f = new Foo();
SubFoo subFoo = new SubFoo();
foos.contains(f); // eclipse , null
foos.contains(subFoo); //
foos.contains(null);
}
このときコンパイラはやめて、仕事ができないことを示します.
Sクラスの定義では,contains(K k)関数が1つの明確なタイプのパラメータしか受け入れられないことを明らかにした.
しかしdoSomeReading関数では、コンパイラはどのタイプがFooタイプなのか、SubFooタイプなのか、SubSubFooタイプなのか、SubSubFooタイプなのかを判断できません.
コンパイラは知らないのでnullタイプのパラメータのみを許可します.
===========================================================
この解析に対して、話はやはり少し憂鬱だ.
equals関数と関係があると考える別の解析もある.しかし、あまり頼りにならない感じがします.これは別の応用としか言えません.
http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic