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).

1
Ewan Brown 20 avril 2017 à 19:16

3 réponses

Meilleure réponse

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

1
Bathsheba 20 avril 2017 à 16:22

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)

0
JDL 20 avril 2017 à 16:32

Une meilleure façon serait de donner à vos deux getters des noms différents.

0
djkhen 20 avril 2017 à 16:23