用Java在列表中存储不同类型的元素

用Java在列表中存储不同类型的元素,java,generics,object,collections,Java,Generics,Object,Collections,我正在尝试开发一个通用的表加载器,它的模式在运行时是已知的。这需要有一个包含不同类型元素列表的类,并支持各种get和set方法,例如getInt(int-index),asString(int-index),asStringList(int-index)。我考虑的元素的类型是整数< /代码>,双,字符串< /代码>,和列表< /代码>,列表和列表< /代码>。每个元素的实际类型在运行时是已知的,我将把它们存储在一个描述其模式的列表中,以便进一步处理 我的问题是:我应该将这样的元素列表存储在lis

我正在尝试开发一个通用的表加载器,它的模式在运行时是已知的。这需要有一个包含不同类型元素列表的类,并支持各种get和set方法,例如
getInt(int-index)
asString(int-index)
asStringList(int-index)
。我考虑的元素的类型是<代码>整数< /代码>,<代码>双,<代码>字符串< /代码>,和<代码>列表< /代码>,<代码>列表和<代码>列表< /代码>。每个元素的实际类型在运行时是已知的,我将把它们存储在一个描述其模式的列表中,以便进一步处理


我的问题是:我应该将这样的元素列表存储在
list
list中吗?您应该使用
list
,或者任何最合适的超类。我曾经问过一个类似的问题,收集了一些非常好的答案,这些答案为您提供了大量相关信息。基本上可以归结为。

因为类的共同祖先是
对象
,并且因为运行时
列表
变成
列表
,所以这里没有机会,你必须有两组独立的类,这真是一种令人讨厌的代码气味。@Brain Roach:我已经包括了我需要它的原因。@Brain Roach:我知道做错事情可能会令人讨厌,所以我要问。你能提供一个更干净的方法来做到这一点吗?我认为dasblinkenlight有一个非常干净的解决方案,可以避免整个列表类型的问题。基本上,他使用了一个很好的OOP原则:更喜欢组合而不是继承。谢谢你的提示,我试过了,但没有找到这篇文章。感谢您提供此信息。为什么我在“public Abstract int”上得到“Abstract methods cannot have a body”?@Zon,因为这是我的复制/粘贴错误:-)感谢您指出。我的列表始终为空,无法查看打印。如果没有ItemWrapper类(仅接口),我们如何在循环之前将任何ItemWrapper添加到myList?Zon我不确定我是否理解您的问题。提出后续问题的最佳方式是将其作为新问题提出,而不是发表评论,因为这样您可以完全访问代码标记,从而为您试图提出的问题提供更好的示例。@TomateFraiche在某个时候,您需要迭代列表,并对其部分或所有元素执行某些操作。除非列表元素上的所有操作都符合对象支持的内容,否则您必须编写处理(例如)整数与字符串不同的代码,因此代码看起来像
if(w instanceof Integer)。。。else if(w instanceof String).
等等。
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
List<ItemWrapper> myList = new ArrayList<ItemWrapper>();

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