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

2022-09-03 05:12:56

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

我的问题是:我应该将这样的元素列表存储在还是?还是有更好的方法来实现这样的类?List<Object>List<? extends Object>


答案 1

由于你的类的共同祖先是 ,并且因为不会使事情变得更干净(毕竟,一切都会扩展),所以看起来是一个不错的选择。ObjectList<? extends Object>ObjectList<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

现在,您可以列出对象,并在不检查其类型的情况下对其进行列表:ItemWrappercalculateSomething

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

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

答案 2

你应该使用 ,或任何最接近的超类。我曾经问过一个类似的问题,它积累了一些非常好的答案,为你提供了很多相关信息。我会检查一下。基本上,这一切都归结为PECS - 生产者扩展,消费者超级List<Object>