堆栈的元素

1 java stack types

如何在Java中将不同数据类型的元素插入到单个堆栈中?

coo*_*ird 10

它似乎打败了泛型的目的,但它在这里:

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

问题是当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);
}
Run Code Online (Sandbox Code Playgroud)

现在,在将泛型添加到语言之前的5天,我们有类似于Java之前的脆弱代码的东西.


Emi*_*l H 6

通常,您需要使用继承来解决此问题.可能使用标记界面:

interface MyMarker
{
}

class Foo implements MyMarker
{
}

class Bar implements MyMarker
{
}
Run Code Online (Sandbox Code Playgroud)

接口在这种情况下是实用的,因为您可以在单个类中实现无限数量的接口,并且您可以在类中的任何位置添加额外的接口.

然后,您可以将Foo和Bar放在同一个堆栈中:

Stack<MyMarker> s = new Stack<MyMarker>();
s.add(new Foo());
s.add(new Bar());
Run Code Online (Sandbox Code Playgroud)

如果可能的话,这是要走的路.否则你将不得不像coobird建议那样做.

  • 这绝对是一种更好的方法 - 只要有"instanceof"的if-elseif阶梯,解决方案通常是继承. (2认同)