諸事情により最近Javaを始めたので、初心者なりに気になったことをメモしていく。

Javaにおいて、Map<K, V>からkeyを指定して値を取り出すときにはMap<K,V>.get()メソッドを使う。 このget()メソッドだが、引数の型は(K型ではなく)Object型とされている。

Map (Java Platform SE 8 )

V get(Object key)

なので、間違ってKとは異なる型の変数をgetにつっこんでも、コンパイルエラーにはならない。

実際、以下のようにあるクラスAをKeyとしたMapを使っていて

Map<A, Integer> someMap = new HashMap<>();
someMap.put(this.getA(), someInteger);
...

A a = this.getA();
int data = someMap.get(a);

あとからMapのkeyをAのあるプロパティに変更した。 このときに、以下のように一部コードを修正し忘れてしまった。

Map<String, Integer> someMap = new HashMap<>();
someMap.put(this.getA().someProperty(), someInteger);
...

A a = this.getA();
//↓修正し忘れ!!
int data = someMap.get(a);
//正しくは
//int data = someMap.get(a.someProperty());

これでコンパイルエラーになってくれればいいのだが、 なってくれないので、 結局バグを見落としてしまった。


以下の記述はおかしなことを書いてあったので一時的に消しました。