在Java中的List中存储不同类型的元素

时间:2013-06-14 21:33:49

标签: java generics object collections

我正在尝试开发一个通用表加载器,该模式在运行时已知。这需要一个包含不同类型元素列表的类,并支持各种get和set方法,例如getInt(int index)asString(int index)asStringList(int index)。我考虑的元素类型包括IntegerDoubleStringList<Integer>List<Double>List<String>。每个元素的实际类型在运行时是已知的,我将它们存储在描述其模式的List中以供进一步处理。

我的问题是:我应该在List<Object>List<? extends Object>中存储这样的元素列表吗?或者有更好的方法来实现这样的课程吗?

2 个答案:

答案 0 :(得分:13)

由于您的课程的共同祖先是Object,并且因为List<? extends Object>不会使事情更清晰(毕竟,所有内容都延伸Object),所以它看起来像List<Object>将是一个不错的选择。

然而,这样的列表将是一个混合包:你需要检查内部对象的运行时类型,并根据它做出决定。这绝对不是一件好事。

更好的选择是创建自己的类,以统一的方式对列表的元素实现操作,并为每个实现这些操作的子类型创建一个不同的子类。这将允许您以统一的方式处理列表,将每个对象的区别推送到包装器中。

public interface ItemWrapper {
    int calculateSomething();
}

public abstract class IntWrapper implements ItemWrapper {
    private int value;

    public IntWrapper(int v) {
      value=v; 
    }

    public int calculateSomething() {
      return value;
    }
}

public abstract class DoubleListWrapper implements ItemWrapper {
    private List<Double> list;

    public DoubleListWrapper (List<Double> lst) {
      list = lst; 
    }

    public int calculateSomething() {
        int res;
        for (Double d : list) {
            res += d;
        }

        return res;
    }
}
// ...and so on

现在,您可以在其上列出ItemWrapper个对象和calculateSomething,而无需检查其类型:

List<ItemWrapper> myList = new ArrayList<ItemWrapper>();

for (ItemWrapper w : myList) {
    System.out.println(
      w.calculateSomething());
}

答案 1 :(得分:5)

你应该使用List<Object>,或者最接近的超级类。我曾经问过一个类似的问题,积累了一些非常好的答案,这些答案有很多相关信息供你参考。 I would check it out。基本上这一切都归结为PECS - Producer Extends, Consumer Super