小编The*_*tie的帖子

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

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

我正在运行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 …
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure name-clash java-8

9
推荐指数
1
解决办法
2627
查看次数

标签 统计

generics ×1

java ×1

java-8 ×1

name-clash ×1

type-erasure ×1