Как вставить элементы разных типов данных в один стек в Java?Стек элементов
ответ
кажется, поражение цели generics, но здесь идет:
Stack<Object>s = new Stack<Object>();
s.add("hello");
s.add(1); // int is autoboxed to Integer
Улов будет то, что при извлечении Object
S из Stack
, он собирается предпринять некоторые усилия, чтобы выяснить, какой тип каждый элемент - это потребует использования instanceof
и преобразования типов:
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);
}
и теперь у нас есть что-то похожее на хрупкий код предварительной Java 5 дней до дженерик были добавлен к языку.
Как правило, вы захотите решить это, используя наследование. Возможно, с помощью интерфейса маркера:
interface MyMarker
{
}
class Foo implements MyMarker
{
}
class Bar implements MyMarker
{
}
Интерфейсы практичны в таких случаях, как это, потому что вы можете реализовать неограниченное количество интерфейсов в одном классе, и вы можете добавить дополнительные интерфейсы, в любом месте в классе hierchy.
Вы можете поместить Foo и Bar в одном стеке:
Stack<MyMarker> s = new Stack<MyMarker>();
s.add(new Foo());
s.add(new Bar());
Это путь, если это вообще возможно. В противном случае вам придется делать это, как подсказывает курурд.
Это определенно лучший способ - всякий раз, когда есть лестница if-elseif из «instanceof», решение обычно является наследованием. – coobird
Общий аргумент стека должен быть общим супер-типом всех типов времени выполнения элементов. Для полностью гетерогенных коллекций Object
является общим супертипом всех ссылочных типов. Итак:
Queue<Object> stack = Collections.asLifoQueue(new ArrayDeque<Object>());
stack.add("red");
stack.add(Color.GREEN);
stack.add(stack);
Очевидно, что вы, когда вы приходите к попам этих элементов из стека вам нужно будет сделать instanceof
проверку на путь к соответствующему коду (и, вероятно, отливать).
Возможно, лучше ввести слой косвенности. Вместо того, чтобы напрямую помещать объекты в очередь, оберните их значимым объектом. Проверки instanceof
могут быть заменены вызовами (виртуальными) методами, которые выполняют требуемые операции. Вот как должен выглядеть полиморфизм.
- 1. . Одинаковый стек элементов плавно
- 2. Как переместить 0 элементов в стек int?
- 3. Стек C++. Один из элементов не отображается
- 4. Нажатие элементов в стек с LINQ
- 5. Перетаскивание нескольких элементов одновременно, как стек
- 6. Проблемы с нажатием элементов на стек
- 7. Стек при получении элементов с JavaScript
- 8. Как проверить стек из n элементов?
- 9. Стек стек высокой масштабируемости
- 10. Стек, использующий стек в java
- 11. Что значит дублировать стек?
- 12. Какая структура данных будет содержать ограниченный стек элементов в LIFO?
- 13. Как сделать стек динамическим?
- 14. элегантно анимировать стек divs
- 15. стек символов, стек символьной строки, стек целых чисел, стек целых массивов и т. Д.
- 16. Стек и очередь сложность,
- 17. NDK-стек не может получить полный стек
- 18. Стек стек клиринга. Первые мероприятия пробег
- 19. Как связаны стек вызовов и стек оценки?
- 20. стек ядра и стек приложения пользовательского режима
- 21. Как воссоздать стек UIViewController?
- 22. Итерация через стек
- 23. Как хранить стек в SharedPreferences
- 24. НКИ стек
- 25. Калькулятор стек
- 26. Балансировка стек
- 27. немодифицируемый стек
- 28. действия стек
- 29. Объявление большого массива на стек
- 30. стек различных изображений фона горизонтально?
Опасность заключается в том, когда вы извлекаете элементы позже, вам нужно написать проверки типов объектов. – Joset
Абсолютно - я только что закончил добавление этой части в качестве редактирования. – coobird