【问题标题】:Java generics unchecked conversion warning for ArrayList array of arraysArrayList数组的Java泛型未经检查的转换警告
【发布时间】:2014-01-11 08:31:42
【问题描述】:

我正在尝试为 3 个 ArrayLists 定义一个数组,每个数组都包含一个双精度数组。我使用了以下语法:

ArrayList<double[]> testSamples[] = new ArrayList[] {
    new ArrayList<double[]>(), new ArrayList<double[]>(), new ArrayList<double[]>()
};

但是,当我编译代码时,这会生成 “警告:[未检查] 未检查转换” 警告。 注意:代码工作正常,我只是试图(正确地)修复我的语法以解决警告。由于代码有效,Java似乎支持它,我很困惑为什么我不能写类似的东西(这会产生编译错误):

ArrayList<double[]> testSamples[] = new ArrayList<double[]>[] {
        new ArrayList<double[]>(), new ArrayList<double[]>(), new ArrayList<double[]>()
};

我做错了什么?

【问题讨论】:

  • 是的,它编译并运行正常,但是编译器输出给定的警告。
  • 您不能创建参数化类型的数组。查看此帖子stackoverflow.com/q/18581002/1679863 以获得进一步解释。
  • 一个ArrayList,采用double 类型,被多个ArrayList 类型初始化?
  • @RohitJain 虽然他的 sn-p 中没有这样做。
  • 您的数组创建表达式未参数化,它是原始的,这就是您收到警告的原因。

标签: java generics


【解决方案1】:

您正在从原始类型 ArrayList 的数组隐式转换为 ArrayList&lt;double[]&gt;s 的数组。总而言之,你不应该做这样的事情。如果你知道你会有 3 个列表,那么你可以创建一个类来保存它们:

class Container {
    private ArrayList<double[]> list1;
    private ArrayList<double[]> list2;
    private ArrayList<double[]> list3;

    ...  // constructors and whatnot

    public ArrayList<double[]> getList(int i) {  // analog of testSamples[i]
        switch (i) {
        case 0:
            return list1;
        case 1:
            return list2;
        case 2:
            return list3;
        default:
            throw new IllegalArgumentException();
        }
    }
}

如果列表的数量不固定为 3,那么您可以改用 List&lt;ArrayList&lt;double[]&gt;&gt;

【讨论】:

  • 更好的选择。
  • 这在视觉上肯定更容易,但是集合是在循环中读取和写入的,我想避免使用 if/switch 语句来确定要读取/写入的集合变量。如果我可以编写 testSamples[i],代码会更简洁。
  • @JJ。查看编辑——现在你可以简单地做container.get(i)
  • 当然,将开关逻辑重构为单独的方法会有所帮助,但对于似乎无关紧要的警告仍然是一种解决方法(代码工作正常)。如果没有其他人解决最初的问题,您将获得功劳。
  • @JJ。代码可能按原样工作,但这是一种糟糕的做法。无论如何,如果您只关心警告本身,那么您可以简单地使用@SuppressWarnings。但同样,这只是隐藏了潜在的问题。
【解决方案2】:

这是创建参数化类型数组的常见问题。为什么不能使用new 创建参数化类型的数组是一个很长的话题,这里已经讨论过很多次了;它基本上与数组如何对元素类型执行运行时检查有关,但运行时检查不能检查类型参数。

长话短说,某种未经检查的警告是不可避免的(因为确实有可能使其违反数组类型的保证)。如果您不介意“不安全”,那么编写它的最犹太方法是使用通配符类型而不是原始类型创建数组,并将其转换为正确的数组类型(是的,这是未经检查的转换):

ArrayList<double[]>[] testSamples =
    (ArrayList<double[]>[]) new ArrayList<?>[] { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多