Java名称冲突错误,尽管方法签名不同

为了好玩,我正在尝试实现一个“MultiMap”集合,就像Apache Commons库中已经存在的那样。 我的“删除(K键,V值)”方法出现了一个有趣的错误。 编译器说有一个名称冲突 – 它与“类型Map的删除(对象,对象)”具有相同的擦除。 但是java.util.Map接口中没有定义这样的方法! 只有一个“remove(Object)”方法 – 带有一个参数,而不是我的两个参数版本。 更有趣的是,如果你通过用“删除(对象键,对象值)”替换我的“删除(K键,V值)”手动删除类型信息,它编译得很好。 有谁能解释这种现象?

我正在运行Java 8,以防万一。

import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class MultiMap extends AbstractMap<K, Collection> { private Map<K, Collection> map; public MultiMap() { super(); map = new HashMap(); } //Fine public void clear(K key) { get(key).clear(); } //Fine public boolean add(K key, V value) { if(!containsKey(key)) put(key, new ArrayList()); return get(key).add(value); } //KABOOM!! //"Name clash: The method remove(K, V) of type MultiMap has the same erasure as remove(Object, Object) of type Map but does not override it" public boolean remove(K key, V value) { if(!containsKey(key)) return false; return get(key).remove(value); } @Override public Collection put(K key, Collection values) { return map.put(key, values); } @Override public Set<java.util.Map.Entry<K, Collection>> entrySet() { return map.entrySet(); } } 

但是java.util.Map接口中没有定义这样的方法!

Map接口中有一个Map#remove(Object, Object)方法; 它是在Java 8中添加的。因此错误。

当javagenerics类型转换为字节码时,这是由于类型擦除过程。

在运行时,Map中的default boolean remove(Object key, Object value) (此方法是Java 8中的新方法)与MultiMap类中的方法相同,即public boolean remove(K key, V value)

编译器看到了这个,因此显示错误:

名称冲突:MultiMap类型的remove(K,V)方法与AbstractMap类型的remove(Object,Object)具有相同的擦除function,但不会覆盖它。

请参阅: http : //docs.oracle.com/javase/tutorial/java/generics/genTypes.html