Comment insérer des éléments de différents types de données dans une seule pile Java?Pile d'éléments
Répondre
Il semble vaincre le but de generics, mais ici il va:
Stack<Object>s = new Stack<Object>();
s.add("hello");
s.add(1); // int is autoboxed to Integer
La capture sera que lors de la récupération des Object
s de la Stack
, il va prendre un certain effort pour savoir quel type de chaque élément est - il faudra l'aide instanceof
et typecasts:
while (!s.isEmpty()) {
Object e = s.pop();
if (e instanceof String)
System.out.println("String: " + (String)e);
else if (e instanceof Integer)
System.out.println("Integer: " + (Integer)e);
else
System.out.println("Other type: " + e);
}
et maintenant, nous avons quelque chose qui ressemble au code fragile de la pré-Java 5 jours avant les médicaments génériques a été ajouté à la langue.
Généralement, vous devrez résoudre ceci en utilisant l'héritage. Peut-être en utilisant une interface marqueur:
interface MyMarker
{
}
class Foo implements MyMarker
{
}
class Bar implements MyMarker
{
}
Interfaces sont pratiques dans des cas comme celui-ci, parce que vous pouvez mettre en œuvre un nombre illimité d'interfaces dans une seule classe, et vous pouvez ajouter des interfaces supplémentaires partout dans le hierchy de classe.
Vous pouvez ensuite mettre Foo et Bar dans la même pile:
Stack<MyMarker> s = new Stack<MyMarker>();
s.add(new Foo());
s.add(new Bar());
C'est le chemin à parcourir si elle est possible. Sinon, vous devrez le faire comme coobird suggère.
C'est certainement un meilleur moyen - chaque fois qu'il y a une échelle if-elseif de "instanceof", la solution est généralement l'héritage. – coobird
L'argument générique de la pile doit être un super-type commun de tous les types d'exécution d'élément. Pour les collections complètement hétérogènes, Object
est le super-type commun de tous les types de référence. Alors:
Queue<Object> stack = Collections.asLifoQueue(new ArrayDeque<Object>());
stack.add("red");
stack.add(Color.GREEN);
stack.add(stack);
Il est évident que lorsque vous venez à la pop ces éléments de la pile, vous devez faire vérifier instanceof
pour acheminer le code approprié (et probablement jeté).
Probablement préférable d'introduire une couche d'indirection. Au lieu de placer directement les objets dans la file d'attente, enveloppez-les dans un objet significatif. Les contrôles instanceof
peuvent tous être remplacés par des appels à des méthodes (virtuelles) qui effectuent les opérations dont vous avez besoin. C'est ainsi que le polymorphisme est censé être.
- 1. Comment obtenir la pile de pile dans un appareil mobile?
- 2. enregistrer pile dans arraylist
- 3. Débordement de pile C#
- 4. JavaScript et une pile
- 5. chipmunk pile effet d'automne
- 6. Lucene Search Erreur pile
- 7. Réinstallez la pile de développement
- 8. Recommandations de la pile ZigBee
- 9. Tableau dynamique dans la pile?
- 10. Taille de pile sur BlackBerry?
- 11. Instruction d'échange de pile CIL
- 12. pile dump en utilisant allocation
- 13. Bonne pile d'applications Web-book?
- 14. Que signifie dupliquer une pile?
- 15. (SHLWAPI.DLL): 0xC00000FD: dépassement de pile
- 16. Python sans pile et multicores?
- 17. meilleure compréhension d'une pile OC4J Trace
- 18. retourner la valeur dans une pile - C++
- 19. Comment afficher la pile d'appels avec DTrace
- 20. Comment implémenter une pile générique en C#?
- 21. Débogage d'un débordement de pile flash
- 22. Améliorations pour cet allocateur de pile C++?
- 23. Vérificateur de palindrome basé sur une pile
- 24. Débordements de pile dans l'éditeur JSP Eclipse
- 25. Débordement de pile C++ - Visual Studio 2008
- 26. Dépassement de pile sur IIS 6.0
- 27. iPhone: extraction d'un modalViewController d'une pile UINavigationController
- 28. File d'attente qui utilise une pile
- 29. Comment reconstruisez-vous la pile GWT History?
- 30. after_initialize provoque un débordement de pile
Le danger est lorsque vous récupérez les éléments plus tard, vous devez écrire des contrôles pour les types d'objets. – Joset
Absolument - Je viens juste d'ajouter cette partie en tant que modification. – coobird