【问题标题】:Is it possible to make a List of arrays?是否可以制作数组列表?
【发布时间】:2018-03-12 16:41:13
【问题描述】:

我有 3 个数组,2 个 int 类型的数组和一个 String 类型的数组。

我的问题是,是否可以创建一个包含这 3 个数组的列表?

我希望能够做这样的事情:myList.get(0) 这应该给我列表中的第一个数组。

【问题讨论】:

  • 你试过了吗?另外,最好只创建一个单独的类来保存它们
  • 有可能。但是,不可能有一个包含多种类型的列表。 hack 是创建所有 Object 数组并存储您的值,但如果您需要这种 hack,您可能应该重新考虑您的方法。
  • List of Arrays in Java的可能重复
  • 我同意@BackSlash,我建议您重新考虑解决问题的方法。
  • 是的,我强烈建议重新考虑这一点。如果您打算这样做,davidxxx 提供的答案是最好的,但是您删除了类型检查并引入了不安全的强制转换,所有静态代码分析工具都会对您大喊大叫,并且您可能会遇到奇怪的运行时错误当事情发生变化时的道路。完全不推荐。您是否有理由希望将此作为列表?

标签: java arrays list arraylist


【解决方案1】:

这是可能的,但是在 List 中添加不同类型的数组的值是什么?
您必须声明List<Object>List<Object[]>。因此,您失去了类型安全的好处,因为您必须将数组或数组元素转换为Object 变量来操作其他事物。

例如:

List<Object[]> list = new ArrayList<>();
list.add(new String[5]);
list.add(new Integer[5]);
Object[] objects = list.get(0);

您被Object[] 卡住了。

要操作更具体的类型,您必须执行向下转换:

String[] objects = (String[]) list.get(0);

这会起作用,但您可能会出错,例如:

Integer[] objects = (Integer[]) list.get(0);

而且您只会在运行时将信息作为例外。

请注意,在向下转换数组之前使用instanceof 运算符不会防止程序出现故障。

例如,这不会产生ClassCastException,因为条件语句将被评估为false

if (list.get(0) instanceof Integer[]){
    Integer[] objects = (Integer[]) list.get(0);
    ...
}

但因此,它永远不会执行处理。在某种程度上,情况甚至更糟,因为客户可能看不到该问题。

如果客户端使用不正确的列表但最终更冗长,使用反向逻辑将作为初始代码抛出异常:

if (!(list.get(0) instanceof Integer[])){
    ... // throw exception
}

Integer[] objects = (Integer[]) list.get(0);

当然,您应该忘记将这些数组添加到列表中的想法。

【讨论】:

  • 感谢您的建议,我试图列出这 3 个数组以将其写入二进制文件,然后再从中读取。为每个数组创建一个带有 3 个参数的方法可能会更好。
  • 确实,它让事情变得更清晰。现在作为替代方案,您还可以创建一个自定义类,将 3 个数组声明为字段并为它们提供 getter。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2017-01-10
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多