正しくコンパイルされるJava6のインターフェイスがあります。
public interface IMultiMap<K, V> extends Map<K, Set<V>> {
public int valueSize();
public boolean put(K key, V value);
public void clear(Object key);
public boolean isEmpty(Object key);
}
しかし、Java 7では、このインターフェースはコンパイルされません。boolean put(K, V)
と同じ消去があるというコンパイルエラーが発生しますV put(K, V)
。コンパイラからの完全なエラー:
error: name clash: put(K#1,V#1) in IMultiMap and put(K#2,V#2) in Map have the same erasure, yet neither overrides the other
public boolean put(K key, V value);
where K#1,V#1,K#2,V#2 are type-variables:
K#1 extends Object declared in interface IMultiMap
V#1 extends Object declared in interface IMultiMap
K#2 extends Object declared in interface Map
V#2 extends Object declared in interface Map
ちなみに、オーバーライドを追加しても機能しません。明示的にオーバーライドしようとしMap.put
ましたが、それでもエラーが発生します。put
このエラーが潜在的なエラーに到達するのをブロックしているため、myの戻りタイプを変更することは重要ではありません。このエラーが修正された場合、2つのメソッドはとにかく同じ名前/パラメーターシグネチャを持ちません。
Java 6について少し考えてみて、実際のパラメーターの種類がJava6のコンパイル済みバイトコードにどのようになるかを確認すると思います。両方のJava7メソッドがに消去されていることは明らかですput(Object, Object)
。それができたら、ここにリフレクションの結果を投稿します。
それまでの間、一時的な回避策は名前をに変更するput
ことputSingle
ですが、この新しい動作は正しいですか?Java 7のジェネリック仕様の一部が変更され、古いJava 6の動作が正しくなくなりましたか?それとも、これはJava 7コンパイラのバグですか?
前もって感謝します。
編集:リフレクションコードを実行しました。以下の私の答えをチェックしてください。