我目前正在尝试编写双向映射,因为(据我所知)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类型的对象,反之亦然)。
答案 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 Char
和public F getChByColour(E colour)