我正在尝试开发一个在运行时架构已知的通用表加载器。这需要有一个包含不同类型元素列表并支持各种 get 和 set 方法的类,例如 getInt(int index)
, asString(int index)
, asStringList(int index)
.我考虑的元素类型是 Integer
, Double
, String
, 和 List<Integer>
, List<Double>
和 List<String>
.每个元素的实际类型在运行时都是已知的,我会将它们存储在描述其架构的列表中以供进一步处理。
我的问题是:我应该将这样的元素列表存储在 List<Object>
中吗?或 List<? extends Object>
?还是有更好的方法来实现此类?
最佳答案
因为你的类的共同祖先是 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());
}
关于java - 在 Java 列表中存储不同类型的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17117612/