1

我目前正在尝试编写双向地图,因为(据我所知)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 给我错误“方法 get(E) 的擦除与 SaveManager.ColourCharTwoWayMap 类型中的另一种方法相同”。通过谷歌搜索,我了解到 Java 不喜欢做同样事情的泛型方法,这与覆盖和 Java 不知道使用什么方法有关。这一切都超出了我的想象。

有什么更好的方法来做我上面想做的事情?(即有一个方法接受一个类型为 E 的对象并返回一个类型为 F 的对象,反之亦然)。

4

3 回答 3

1

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

解决方法很简单,把名字改成getE和getF

于 2017-04-20T16:22:19.513 回答
0

如果这两个值中的任何一个都应该有一个特定的父类,IE 看起来像 Color 和 Char 是你的值,你可以绕过类型擦除,但允许 Color 和 Char 的子类,通过说E extends Coloror F extends Char。这使它们更加“具体”并且编译器能够区分两者。但是,如果您的 Color 或 Char 派生自同一个父类、IE 对象或 String,则需要实现不同的方法签名。

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

于 2017-04-20T16:32:36.630 回答
0

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

于 2017-04-20T16:23:49.247 回答