web-dev-qa-db-fra.com

Dépannage de l'avertissement "Le paramètre de type T masque le type T"

Je reçois un avertissement dans Eclipse (la version la plus récente) pour le code suivant.

public interface A<T> extends B<T> {
     public T getObject();
}

L'avertissement apparaît en "T" dans "A" et se lit comme suit: "Le paramètre de type T masque le type T".

La partie étrange est que le code suivant ne génère aucune erreur ni avertissement.

public interface A extends B<T> {
     public T getObject();
}

Mais maintenant, je ne peux pas étendre A tout en lui disant de quel type T il s'agit.

Je suis complètement confus. quelquun sait pourquoi cela se passe? Je vous remercie.

43
nikdeapen

Avez-vous quelque part une classe ou une interface nommée T, ou utilisez-vous T comme nom de type concret quelque part plutôt que comme paramètre de type (ce qui signifie que vous pourriez avoir oublié ailleurs, par exemple dans une classe englobante, pour spécifier que T est un paramètre de type)? Je peux reproduire votre problème avec ceci:

class T {  // A concrete type T
}

interface B<T> {  // warning: The type parameter T is hiding the type T
}

interface A<T> extends B<T> {  // warning: The type parameter T is hiding the type T
    T getObject();
}

Si je supprime la classe T, elle disparaît.

51
Jesper

Juste pour développer la dernière réponse (je sais que la question est ancienne et fermée), je vais fournir un cas le plus simple où vous pouvez comprendre l'erreur:

Imaginez une interface avec une méthode générique telle que:

<T> Output<T> doSomething(Input<T> input);

Si vous essayez de le remplacer par:

@Override
public <Object> Output<Object> soSomething(Input<Object> input){
    /*..*/
}

Le compilateur vous avertit:

Le paramètre de type Object masque le type Object

Cela signifie que "Object" est une étiquette générique ici, ce n'est pas Java.lang.Object. Si vous avez changé le type d'objet en V ou n'importe quelle lettre arbitraire, cela ne se produirait pas. Mais vous utilisez et appelative qui entre en collision avec une classe définie réelle, donc le compilateur vous avertit que cet objet de vous cache ce qui autrement serait compris comme la classe Object commune.

4
Whimusical

J'essaie:

public interface B<T> {
    T getObject();

    public  interface A<T> extends B<T>{
        T getObject();
    }
}

sur Eclipse Indigo Service Release 2 et il n'y a aucun avertissement ou erreur

2