9
votes

Méthode générique - "Conversion non cochée pour être conforme à T du type" Avertissement

Si j'ai ce qui suit:

- Type safety: The return type Bar for getBlah from the type Bar needs unchecked conversion to conform to T from the type 
 Foo


3 commentaires

Vous avez écrit que le type renvoyé par getblah doit prolonger l'interface foo . Mais bar ne le fait pas, il l'applique.


'étend' couvre les implémentations d'interface


Un cas de trop généralisation. Voir le commentaire de JoeblackDev et la réponse de Alessandro Santini.


3 Réponses :


14
votes

Vous prenez une méthode à partir de votre interface, vous devez donc correspondre à votre implémentation de la signature de votre spécification:

public interface Foo<T extends Foo<T>> {
    T getBlah();
}

public class Bar implements Foo<Bar> {
   @Override
   public Bar getBlah() {  
      return this;
   }
}


3 commentaires

Et pourquoi, dans le nom de Dieu, devrait-il déduire un type générique qui n'est utilisé nulle part?


Je ne suppose pas que c'est son code entier. Parce que tu sais ce qu'ils disent sur les hypothèses ...


La première ligne doit être Interface publique FOO > ou Interface publique FOO > .



3
votes

Je ne suis pas sûr que voulez-vous accomplir ici, mais je pense que le retour de FOO serait OK:

interface Foo {

  public Foo getBlah();

}


0 commentaires

4
votes
<T extends Foo> T getBlah();
means that a caller can request any type as T to be returned. So no matter what class the object is, I can request some other random subclass of Foo of my choosing to be returned. The only value that such a method could validly return is null (unless it does unsafe casts), which is probably not what you want.

0 commentaires