kee*_*lar 9 java generics collections object
我正在尝试开发一个通用的表加载器,该模式在运行时是已知的.这需要具有包含不同类型的元素的列表,并支持各种get和诸如设置方法的类getInt(int index)
,asString(int index)
,asStringList(int index)
.元素我考虑的类型有Integer
,Double
,String
,和List<Integer>
,List<Double>
和List<String>
.每个元素的实际类型在运行时是已知的,我将它们存储在描述其模式的List中以供进一步处理.
我的问题是:我应该将这些元素列表存储在List<Object>
或中List<? extends Object>
吗?还是有更好的方法来实现这样的课程?
das*_*ght 15
由于你的类的共同祖先是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
Run Code Online (Sandbox Code Playgroud)
现在,您可以创建ItemWrapper
对象列表,而calculateSomething
无需检查其类型:
List<ItemWrapper> myList = new ArrayList<ItemWrapper>();
for (ItemWrapper w : myList) {
System.out.println(
w.calculateSomething());
}
Run Code Online (Sandbox Code Playgroud)
你应该使用List<Object>
,或者最适合的超级类.我曾经问过一个类似的问题,积累了一些非常好的答案,这些答案有很多相关信息供你参考.我会检查一下.基本上这一切都归结为PECS - Producer Extends,Consumer Super.