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

标签 java generics java-8 type-erasure name-clash

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

我正在运行 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<K, V> extends AbstractMap<K, Collection<V>>
{
    private Map<K, Collection<V>> 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<K,V> has the same erasure as remove(Object, Object) of type Map<K,V> 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<V> put(K key, Collection<V> values)
    {
        return map.put(key, values);
    }

    @Override public Set<java.util.Map.Entry<K, Collection<V>>> entrySet()
    {
        return map.entrySet();
    }
}

最佳答案

But there is no such method defined in the java.util.Map interface!

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

关于Java 名称冲突错误,尽管方法签名不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23785807/

相关文章:

java - Apache Beam 中是否支持 Azure Blob?

java - JPA findby 过滤子字符串列表

java - 编写一个程序来遍历另一个程序

C++ 方法调用模板函数无法调用重载方法

java - 如何在 Java 中的 Windows 和 IANA 时区之间进行转换

仅使用 JavaScript (Nashorn) 进行 JavaFX 开发

java - ServiceTracker 找到哪些服务

Typescript:键与值类型相同的映射,不限制键的类型

C# 如何通过方法中的可选参数解决这个困境?

java - 将订阅者添加到单个观察值