编写双向映射时如何绕过 "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 Color
或 F extends Char
。这使它们更 "concrete" 并且编译器能够区分两者。但是,如果您的 Color 或 Char 派生自相同的父 class、IE 对象或 String,则您需要实现不同的方法签名。
IE public F getChByColour(E colour)
和 public E getColourByChar(F char)
我目前正在尝试编写双向地图,因为(据我所知)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 Color
或 F extends Char
。这使它们更 "concrete" 并且编译器能够区分两者。但是,如果您的 Color 或 Char 派生自相同的父 class、IE 对象或 String,则您需要实现不同的方法签名。
IE public F getChByColour(E colour)
和 public E getColourByChar(F char)