2017-06-13 3 views
0

Je ne comprends pas pourquoi je reçois ces erreurs de compilation:supérieur borné wildcards provoquant une erreur de compilation en Java

1:

La méthode add (? Capture # 1 de Prolonge Exec.Bird) dans la liste des types ne sont pas applicables pour les arguments (Exec.Sparrow)

2:

le méth od ajouter (capture # 2-of? étend Exec.Bird) dans la liste des types est pas applicable pour les arguments (Exec.Bird)

static class Bird{} 
static class Sparrow extends Bird{} 

public static void main(String[] args){ 
    List<? extends Bird> birds = new ArrayList<Bird>(); 
    birds.add(new Sparrow()); //#1 DOES NOT COMPILE 
    birds.add(new Bird());// //#2 DOES NOT COMPILE 
} 
+0

Concernant # 1: avec 'Liste 'vous dites réellement * tout type qui est un sous-type de' Bird' *. Cela signifie qu'il peut être un Sparrow, mais il peut également s'agir d'un Blackbird. Si vous essayez d'ajouter un 'Sparrow' à une liste qui * pourrait * contenir uniquement' Blackbird's, cela ne fonctionnera pas. –

Répondre

0

Avec List<? extends Bird> vous dites en fait tout type qui est un sous-type de Bird. Ce n'est pas la même chose que de dire chaque type qui s'étend Bird. Cela signifie que ? peut être un Sparrow, mais il peut également s'agir d'un Blackbird. Si vous essayez d'ajouter un Sparrow à une liste que pourrait contenir seulement Blackbird, il ne fonctionnera pas. Pour la même raison, vous ne pouvez pas ajouter un Bird à une liste que pourrait être une liste de Sparrow s.

Afin de faire fonctionner les choses, vous changez simplement la déclaration de la liste à ceci:

List<Bird> birds = new ArrayList<>(); 

ou utilisez minoration:

List<? super Bird> birds = new ArrayList<>(); 

A propos de cet exemple minoration: la déclaration fait dit tout type qui est un Bird ou l'une de ses superclasses. Cela signifie que vous pouvez ajouter en toute sécurité un Sparrow ou un Bird, car les deux répondent à ces critères. En règle générale, vous devez utiliser ? super ... lorsque vous écrivez dans la liste et ? extends ... lorsque vous lisez dans la liste. Si vous lisez et écrivez, vous ne devez pas utiliser de limites.


This answer fournit des informations très utiles sur les génériques. Vous devriez vraiment le lire.

0

Vous pouvez instancier la liste birds comme ceci:

List<Bird> birds = new ArrayList<>(); 

code complet:

import java.util.ArrayList; 
import java.util.List; 

public class Main { 
    static class Bird{} 
    static class Sparrow extends Bird{} 

    public static void main(String[] args) { 
     List<Bird> birds = new ArrayList<>(); 
     birds.add(new Sparrow()); 
     birds.add(new Bird()); 
    } 
}