当前位置: 首页 > 面试题库 >

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

颜黎昕
2023-03-14
问题内容

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

我的问题是:我应该在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());
}


 类似资料:
  • 问题内容: 我想将元素存储在一个列表中,每个元素具有4个参数,我试图创建一个数组列表,该列表为每个元素存储4个参数,它们是不同类型的: iD:int x位置:浮点 y位置:浮点 名称:字符串 我用: 但是当我使用时: 我得到错误: “ ArrayList类型的add(int,Object)方法不适用于参数(in,float,float)” 我不知道如何能够向ArrayList添加不同类型,有没有办

  • 问题内容: 在Swift编程语言中,它说“一个数组在一个有序列表中存储相同类型的多个值”。但是我发现您可以在数组中存储多种类型的值。描述不正确吗? 例如 问题答案: 来自REPL 您可以看到的是,这是或 发生的事情是提供了将数字和布尔值转换为的能力。需要编译代码时,编译器将执行转换。 因此,它们现在具有的通用类型,因此可以推断为 没有,您的代码将无法在REPL中编译。 但是你可以做到 因为它们具有

  • 在C#中,我可以制作一个列表并向其添加不同类型的项。只要它们继承基类即可。例如: Rust不是面向对象编程语言,但我想知道是否可以实现类似的功能。有办法吗?

  • 每个类都有一些独特的字段。所有最大的功能是:添加,更新,删除,查找,显示列表,保存,加载文件 -所以,首先我将创建一个名为Product的类,它有4个公共字段。以上课程将从产品延伸。 -然后,我想我可能会创建一个ComputerStore类,它有一个字段是items类型ArrayList。items存储所有的对象,这些对象是上述4个类的实例,但我不确定。

  • 我必须创建一个程序,打印出日期列表(年、月、日),直到用户选择日期(,稍后转换为)。 例如,如果今天是2017-09-30星期六,并且用户输入日期是2017-10-30,程序必须打印这些日期: 2017-09-30, 2017-10-07, 2017-10-14, 2017-10-21, 2017-10-28. 问题: 将日历类型元素添加到列表中 当我试图打印它时,输出只是一堆相同日期的副本。 输