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