2017-04-20 3 views
0

Im actuellement en train d'essayer d'écrire une carte bidirectionnelle depuis (pour autant que je peux voir) Java n'en fournit pas. Mon code est le suivant.Comment se déplacer "Effacement de la méthode est la même que d'une autre méthode" lors de l'écriture d'une carte bidirectionnelle

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 "Erasure de méthode get (E) est identique à une autre méthode de type SaveManager.ColourCharTwoWayMap". De googling, 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 dépassement et Java ne sachant pas quelle méthode utiliser. Tout est un peu sur ma tête.

Quelle est la meilleure façon de faire ce que j'essaie de faire ci-dessus? (ie avoir une méthode qui prend un objet de type E et retourne un objet de type F et vice versa).

+0

Juste une question de côté, pourquoi n'êtes-vous pas utiliser une carte interne? – Koekje

Répondre

0

Vos deux fonctions get ont le même type de paramètre: 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é puisque les noms des fonctions sont également les mêmes et le compilateur émet et erreur.

La solution est simple, changer les noms Gete et getf

0

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

0

Si l'une des deux valeurs est supposée avoir une classe parente particulière, IE ressemble à Color et Char sont des valeurs, vous pouvez contourner l'effacement de type, mais autoriser le sous-classement de Color et Char, en disant E extends Color ou F extends Char. Cela les rend plus "concrets" et le compilateur est capable de différencier les deux. Cependant, si votre couleur ou caractère est dérivé de la même classe parent, IE objet ou chaîne, vous devrez implémenter différentes signatures de méthode.

IE public F getChByColour(E colour) et public E getColourByChar(F char)