J'essaye actuellement d'écrire une carte bidirectionnelle puisque (pour autant que je puisse voir) Java n'en fournit pas. Mon code est le suivant.
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 me donne l'erreur "L'effacement de la méthode get (E) est identique à une autre méthode du type SaveManager.ColourCharTwoWayMap". De googler, je comprends que Java n'aime pas les méthodes génériques qui font la même chose, et que c'est quelque chose à voir avec le remplacement et Java ne sachant pas quelle méthode utiliser. C'est un peu au-dessus de ma tête.
Quelle est la meilleure façon de faire ce que j'essaie de faire ci-dessus? (c'est-à-dire avoir une méthode qui prend un objet de type E et retourne un objet de type F et vice versa).
3 réponses
Vos deux fonctions get ont le même type de paramètre - un java.lang.Object en raison de l'effet d'effacement de type auquel vous avez déjà fait allusion. Ce n'est évidemment pas autorisé car les noms des fonctions sont également les mêmes et le compilateur émet une erreur.
La solution est simple, changez les noms pour obtenir et obtenir
Si l'une des deux valeurs est censée avoir une classe parente particulière, IE ressemble à Color et Char are you values, vous pouvez contourner l'effacement de type, mais autorisez le sous-classement de Color et Char, en disant que {{X0} } ou F extends Char
. Cela les rend plus «concrets» et le compilateur est capable de différencier les deux. Cependant, si votre Color ou Char est dérivé de la même classe parent, objet IE ou String, vous devrez implémenter des signatures de méthode différentes.
IE public F getChByColour(E colour)
et public E getColourByChar(F char)
Une meilleure façon serait de donner à vos deux getters des noms différents.
De nouvelles questions
java
Java est un langage de programmation de haut niveau. Utilisez cette balise lorsque vous rencontrez des problèmes pour utiliser ou comprendre la langue elle-même. Cette balise est rarement utilisée seule et est le plus souvent utilisée en conjonction avec [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] et [maven].