こんなコードがあった。
HashMapを継承したカスタムHashMapクラス
@Override
public Object put(Object key, Object value) {
// キーを小文字にする
return super.put(key.toString().toLowerCase(), value);
}
カスタムHashMapを使用しているコード
CustomHashMap map = new CustomHashMap();
map.putAll(valueMap); // Java7ではキーがすべて小文字になる
Java7からJava8に上げると、mapのキーが小文字にならずに、今まで通りの挙動をしなくなった。
HashMapのコードを読んだところ、
- Java7では、putAll()からput()を呼び出している
- Java8では、putAll()からput()を呼び出していない
ことが原因と判明。つまり、Overrideしたputメソッドを呼び出していないためである。
putAllはOverrideしていなかったので、Java7ではたまたま動いていた、と考えるべきか。
(Java7の実装を読んでいたのかも知れないが。)