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