如何绕过"方法的擦除与另一种方法相同"在编写双向映射时

时间:2017-04-20 16:16:21

标签: java eclipse type-erasure bidirectional bimap

我目前正在尝试编写双向映射,因为(据我所知)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给出了错误&#34;方法的擦除get(E)与SaveManager.ColourCharTwoWayMap&#34;类型中的另一个方法相同。从谷歌搜索,我知道Java不喜欢做同样事情的泛型方法,并且它与覆盖和Java不知道使用什么方法有关。这一切都在我脑海里。

有什么更好的方法来做我上面尝试做的事情? (即,有一个方法可以获取E类型的对象并返回F类型的对象,反之亦然)。

3 个答案:

答案 0 :(得分:0)

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

解决方案很简单,将名称更改为getE和getF

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果两个值中的任何一个应该具有特定的父类,IE看起来像Color和Char是你的值,你可以绕过类型擦除,但允许对Color和Char进行子类化,通过说{ {1}}或E extends Color。这使他们更具有特色和#34;并且编译器能够区分这两者。但是,如果您的Color或Char派生自相同的父类,IE对象或String,则需要实现不同的方法签名。

IE F extends Charpublic F getChByColour(E colour)