im当前试图编写双向映射,因为(据我所知(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类型的对象的方法,反之亦然(。
您的两个获取函数具有相同的参数类型-Java.lang.Object,由于您已经提到的类型擦除效果。这显然不允许,因为功能名称也相同,并且编译器发出和错误。
解决方案很简单,将名称更改为gete and getf
更好的方法是给您的两个getters不同的名称。
如果两个值中的任何一个都应该具有特定的父类,则IE看起来像颜色,char是您的值颜色和字符,说E extends Color
或F extends Char
。这使他们更加"混凝土",并且编译器能够区分两者。但是,如果您的颜色或字符是从同一父类派生的,即对象或字符串,则需要实现不同的方法签名。
IE public F getChByColour(E colour)
和public E getColourByChar(F char)