我在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
,但错误仍然出现。 改变我的返回类型put
,因为这个错误是阻断正在达到有史以来从潜在的错误,如果这个错误是固定的,那么这两个方法不会有相同的名称/参数签名反正是没有实际意义。
我想我可能会尝试在Java 6的一些反思,看看实际的参数类型最终在Java 6中的编译的字节代码之中。 很明显,这两个Java 7的方法正在擦除put(Object, Object)
。 一旦我这样做,我会在这里发表的反射效果。
在此期间,我的临时解决办法将是多么重命名put
至putSingle
,但这种新的行为是否正确? 做了仿制药的规格变化对Java 7,使旧的Java 6的行为错误的某些部分? 或者,这是Java编译器7的错误?
提前致谢。
编辑:我跑的反射代码。 看看我的回答如下。