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

标签 java generics object collections

我正在尝试开发一个在运行时架构已知的通用表加载器。这需要有一个包含不同类型元素列表并支持各种 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/

相关文章:

java - 如何修改WTPartDescribeLink?

java - 使用 Java 和 Hibernate HQL 验证账户余额

java - 将相同的对象存储在不同的数组中

java - 解析 XML,删除 & 之后的所有字符

java - 在Java中定义常量并在集合中使用它们

java - 类型安全 : The expression of type Map[] needs unchecked conversion to conform to Map<String, 对象>[]

android - 泛型方法在将其作为参数传递时不会识别泛型类型

javascript - jQuery 中更快的循环

java - 如何检测 android 屏幕上的触摸位置?

vb.net - 类型转换通用参数