Стек элементов - PullRequest
1 голос
/ 25 мая 2009

Как вставить элементы разных типов данных в один стек в Java?

Ответы [ 3 ]

10 голосов
/ 25 мая 2009

Кажется, что победить цель дженериков , но здесь это идет:

Stack<Object>s = new Stack<Object>();
s.add("hello");
s.add(1);           // int is autoboxed to Integer

Уловка будет в том, что при извлечении Object s из Stack потребуется некоторое усилие, чтобы выяснить, какой тип каждого элемента - для этого потребуется использовать instanceof и 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);
}

А теперь у нас есть нечто, похожее на хрупкий код до Java за 5 дней до того, как дженерики были добавлены в язык.

6 голосов
/ 25 мая 2009

Как правило, вы хотите решить эту проблему с помощью наследования. Возможно использование интерфейса маркера:

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());

Это путь, если это вообще возможно. В противном случае вам придется делать это так, как предлагает coobird.

0 голосов
/ 25 мая 2009

Общий аргумент стека должен быть общим супертипом всех типов времени выполнения элемента. Для полностью разнородных коллекций Object является общим супертипом всех ссылочных типов. Итак:

Queue<Object> stack = Collections.asLifoQueue(new ArrayDeque<Object>());
stack.add("red");
stack.add(Color.GREEN);
stack.add(stack);

Очевидно, что когда вы приходите извлекать эти элементы из стека, вам нужно будет сделать instanceof проверку, чтобы направить к соответствующему коду (и, вероятно, приведению).

Наверное, лучше было бы ввести слой косвенности. Вместо непосредственного помещения объектов в очередь, оберните их в значимый объект. Все проверки instanceof можно заменить вызовами (виртуальных) методов, которые выполняют необходимые операции. Вот как должен быть полиморфизм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...