2008-10-16 10 views

Répondre

5

Oui, mais vous obtiendrez des exceptions de distribution si vous essayez d'accéder à un élément non-nœud comme s'il s'agissait d'un nœud. Les génériques sont ignorés à (pour) l'exécution.

Par exemple:

import java.util.*; 
import java.awt.Rectangle; 

public class test { 
    public static void main(String args[]) { 
     List<Rectangle> list = new ArrayList<Rectangle>(); 
     /* Evil hack */ 
     List lst = (List)list; 

     /* Works */ 
     lst.add("Test"); 

     /* Works, and prints "Test" */ 
     for(Object o: lst) { 
      System.err.println(o); 
     } 

     /* Dies horribly due to implicitly casting "Test" to a Rectangle */ 
     for(Rectangle r: list) { 
      System.err.println(r); 
     } 
    } 
} 
1

Vu:

List<Node> nodelist = new ArrayList<Node>(); 
    Object toAdd = new Object(); 

alors:

((List) nodelist).add(toAdd); 

ou

((List<Object>) nodelist).add(toAdd); 

fera le hack. Ick. Je me sens sale. Mais, tu ne devrais pas faire ça. Si vous avez vraiment besoin de mélanger les types, faites ceci:

List<Object> mixedList = new ArrayList<Object>(list); 
    mixedList.add(toAdd); 

Cette solution, au moins, indiquera aux autres qu'ils doivent prendre garde que toute sous-classe de l'objet peut être dans la liste.

0

En supposant que vous utilisez Generic pour avoir une ArrayList, vous pouvez y ajouter un non-nœud en utilisant la réflexion car pendant l'exécution, les informations de type ne sont pas conservées.

Selon la façon dont vous obtenez l'objet hors de ArrayList, vous pourriez être frappé par ClassCastException.

Si vous avez vraiment besoin d'un type non spécifique dans votre ArrayList, alors pourquoi ne pas l'utiliser sans Generic?