编写双向映射时如何绕过 "Erasure of method is the same as another method"

How to get around "Erasure of method is the same as another method" when writing a Bidirectional Map

我目前正在尝试编写双向地图,因为(据我所知)Java 没有提供。我的代码如下。

private static final class ColourCharTwoWayMap<E,F> {

    private ArrayList<E> eArrayList;
    private ArrayList<F> fArrayList;

    private ColourCharTwoWayMap() {
        eArrayList = new ArrayList<E>();
        fArrayList = new ArrayList<F>();
    }

    public void put(E colour, F ch) {
        eArrayList.add(colour);
        fArrayList.add(ch);
    }

    public F get(E colour) throws ArrayIndexOutOfBoundsException {
        return fArrayList.get(eArrayList.indexOf(colour));
    }

    public E get(F ch) throws ArrayIndexOutOfBoundsException {
        return eArrayList.get(fArrayList.indexOf(ch));
    }
}

Eclipse 给我错误 "Erasure of method get(E) is the same as another method in type SaveManager.ColourCharTwoWayMap"。通过谷歌搜索,我了解到 Java 不喜欢做同样事情的通用方法,并且它与覆盖和 Java 不知道使用什么方法有关。这一切都让我有点头疼。

完成我上面想做的事情的更好方法是什么? (即有一个方法接受类型 E 的对象和 returns 类型 F 的对象,反之亦然)。

由于您已经提到的类型擦除效果,您的两个 get 函数具有相同的参数类型 - java.lang.Object。这显然是不允许的,因为函数名称也是相同的,并且编译器会发出错误。

解决方法很简单,改名为getE和getF

更好的方法是给你的两个吸气剂起不同的名字。

如果这两个值中的任何一个应该有一个特定的父 class,IE 看起来像 Color 和 Char 是你的值,你可以绕过类型擦除,但允许子 classing 颜色和字符,表示 E extends ColorF extends Char。这使它们更 "concrete" 并且编译器能够区分两者。但是,如果您的 Color 或 Char 派生自相同的父 class、IE 对象或 String,则您需要实现不同的方法签名。

IE public F getChByColour(E colour)public E getColourByChar(F char)