2014-05-20 5 views
2

Je veux utiliser un ArrayList pour mon code mais il doit contenir différents types d'objets. il devrait donc être STH comme ceci:Java: même nom mais type générique différent

switch (foo) { 
     case "foo1": 
      list=new ArrayList<foo1>(); 
      break; 
     case "foo2": 
      list = new ArrayList<foo2>(); 
      break; 

Je sais que le code affiché ne fonctionne pas, mais est-il possible de faire équiv.

Et avant de demander il devrait y avoir plusieurs actions effectuées sur cette liste, mais je ne vais pas écrire à nouveau tout simplement avec un nom différent pour la liste.

public class foo1 {} 

public class foo2 {} 

    import java.util.ArrayList; 
public class work{ 
    public static void main(String[] args){ 
    ArrayList<?> list; 
    switch (args[0]) { 
      case "foo1": 
       list=new ArrayList<foo1>(); 
       break; 
      case "foo2": 
       list= new ArrayList<foo2>(); 
       break; 
      default: 
       System.out.println("Some Error Text"); 
       return; 

     } 
    list.add(new foo1()); 
    } 
} 
+0

Regardez dans les caractères génériques. –

+0

C'est possible, mais probablement pas très utile. Cela ressemble à [problème XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Pouvez-vous décrire comment aimeriez-vous utiliser la référence à de telles listes? – Pshemo

+0

le code posté fonctionnera dans Java 7 – nikis

Répondre

5

Qu'est-ce que vous demandez est tout à fait inutile en raison de l'effacement de type. Les paramètres de type cessent d'exister au moment de l'exécution, donc la chose que vous obtenez de new ArrayList<Foo1> est exactement la même que celle que vous obtenez de new ArrayList<Foo2>. En d'autres termes, les paramètres de type sont uniquement des informations pour le compilateur. Et avec le code avec lequel vous travaillez, le compilateur se soucie seulement du type déclaré de list, pas du type que vous fournissez lorsque vous l'instanciez.

Bien sûr, votre code compilera si vous avez déclaré

ArrayList<?> list; 

ou

List<?> list; 

ou vous pouvez le réduire si Foo1 et Foo2 ont un commun supertype (autre que Object) - Disons qu'ils sont les deux sous-types de Foo, vous pouvez écrire

List<? extends Foo> list; 

mais pourquoi vous embêteriez-vous?

+0

Merci qui a fonctionné, mais maintenant je ne peux pas utiliser les méthodes de ArrayList. Je reçois un "types incompatibles: ArrayList ne peut pas être converti en ArrayList ...". Est-ce que je dois le lancer au bon type à chaque fois? – user3657850

+0

Pouvez-vous donner un exemple d'une ligne de code qui vous donne cette erreur? –

+0

J'ai donc créé une liste avec le caractère générique et l'ai initialisé avec différents types génériques dans un cas de commutateur mais quand je veux utiliser quelque chose comme fooList.add (foo1); il me donne l'erreur avec . – user3657850

Questions connexes