2010-03-26 4 views
0

Pourquoi la méthode add() ne compile-t-elle pas ici?Vecteur générique en Java

Vector<?> vectorList[] = new Vector<?>[10]; 
vectorList[0].add("elem1"); 

Merci

+1

Dans ces cas, il est généralement préférable de publier l'erreur du compilateur. Puisque vous n'avez pas posté la plaque de la chaudière Java, nous ne pouvons pas garantir l'erreur exacte. – Mike

Répondre

3

Il y a plusieurs problèmes avec votre code. Premièrement, les éléments du tableau ne sont pas initialisés et vous ajoutez donc un vecteur inexistant. Et, deuxièmement, ajouter à un conteneur générique où le type est un caractère générique n'a pas de sens, car il pourrait être restreint à un type plus limité, et ainsi l'ajout ne serait pas sûr.

Vous pouvez résoudre le premier problème, en remplissant votre tableau:

 
for (int i = 0; i < 10; i++){ 
    vectorList[i] = new Vector<Integer>(); // can replace Integer with 
              // any binding for ? 
} 

Maintenant que vous avez vu qu'il peut être rempli avec des vecteurs qui n'acceptent pas de type String, vous pouvez voir pourquoi l'instruction add échouerait par la suite. Vous pouvez résoudre ce problème en liant à un type spécifique (par exemple, String) plus tôt.

Voir le Java Generics: Wildcards du tutoriel Java pour plus d'informations.

EDIT
Il semble que je suis doutais, et j'ai donc l'exemple complet, compilable suivant:

 
import java.util.*; 

public class Main 
{ 
    public static void main(String[] args){ 
     Vector<?> vectorList[] = new Vector<?>[10]; 
     for (int i = 0; i < 10; i++){ 
      vectorList[i] = new Vector<Integer>(); 
     } 
     System.out.println("Hello world"); 
    } 
} 

avec javac Main.java donne Compiler aucune erreur de compilation.

+0

Cela ne compile pas non plus (Impossible d'instancier le type Vector ) – portoalet

+0

@portoalet, l'avez-vous utilisé? ou un type spécifique dans votre nouvelle déclaration? –

+0

@portoalet, je l'ai testé, et je n'ai aucun problème. –

0

Parce que vous devez instancier chaque vecteur dans le tableau, non seulement le tableau lui-même

vectorList[0] = new Vector<?>(); 
+0

Même si j'ai instancié le vecteur, il ne serait toujours pas compilé. – portoalet

+0

voir mon commentaire à votre publication – Mike

2

Il ne compile pas parce que vectorList[0] est de type Vector<?>, et vous ne pouvez pas appeler add(T) sur une collection générique . Vous ne pouvez pas appeler add(T) car vous ne pouvez pas garantir que l'élément que vous ajoutez est du type (inconnu) que contient vectorList[0]. La leçon à tirer ici est que les types génériques et les tableaux ne sont pas compatibles. C'est-à-dire, vous ne pouvez pas faire vectorList de type Vector<String>[] sans un cast décochée, le type Vector[] vous donnera un type brut à traiter, et vous ne pouvez pas faire ce que vous voulez avec un Vector<?>[] (le seul qui ne produit pas un avertissement). Au lieu de cela, utilisez .