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

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

我的问题是:我应该在ListList存储这样的元素List List ? 或者有更好的方法来实现这样的类?

由于您的类的共同祖先是Object ,并且因为List List不会让事情更干净(毕竟,一切都扩展了Object )看起来像List将是一个不错的选择。

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

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

 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 list; public DoubleListWrapper (List lst) { list = lst; } public int calculateSomething() { int res; for (Double d : list) { res += d; } return res; } } // ...and so on 

现在,您可以创建ItemWrapper对象的列表,并在不检查其类型的情况下calculateSomething其中的某些内容:

 List myList = new ArrayList(); for (ItemWrapper w : myList) { System.out.println( w.calculateSomething()); } 

你应该使用List ,或者最接近的超类。 我曾经问过一个类似的问题,积累了一些非常好的答案,这些答案有很多相关信息供你参考。 我会检查一下 。 基本上这一切都归结为PECS – Producer Extends,Consumer Super 。