我在 Java 6 中有一个可以正确编译的接口:
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
,但仍然出现错误。更改 my 的返回类型put
没有实际意义,因为此错误阻止了该潜在错误的发生,并且如果此错误已修复,那么这两种方法无论如何都不会具有相同的名称/参数签名。
我想我可能会尝试对 Java 6 进行一些反思,看看实际参数类型最终会出现在 Java 6 的编译字节码中。很明显,这两种 Java 7 方法都被删除为put(Object, Object)
. 一旦我这样做,我会在这里发布反射结果。
同时,我的临时解决方法只是重命名put
为putSingle
,但这种新行为是否正确?Java 7 的某些泛型规范是否发生了更改,导致旧的 Java 6 行为错误?或者这是 Java 7 编译器中的错误?
提前致谢。
编辑:我运行了反射代码。在下面查看我的答案。