2014-01-10 54 views
0

我想为3个ArrayLists定义一个数组,每个ArrayLists都包含一个双数组。我用以下语法:阵列ArrayList数组的Java泛型未选中转换警告

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[]>() 
}; 

我在做什么错?

+0

是的,它编译并运行正常,但编译器输出给定的警告。 –

+0

您不能创建一个参数化类型的数组。查看这篇文章http://stackoverflow.com/q/18581002/1679863进一步的解释。 –

+0

'ArrayList',需要''double'类型,由几个'ArrayList'类型初始化? – christopher

回答

4

您隐式地将原始类型数组ArrayList转换为数组ArrayList<double[]> 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<ArrayList<double[]>>来代替。

+1

更好的选择。 –

+0

这对眼睛来说肯定更容易,但是集合正在循环中读取和写入,并且我想避免使用if/switch语句来确定要读取/写入哪个集合变量。如果我只写了testSamples [i],代码就更简洁了。 –

+0

@JJ。看看编辑 - 现在你可以简单地做'container.get(i)'。 – arshajii

1

这是创建参数化类型数组的常见问题。为什么你不能使用new来创建一个参数化类型的数组是一个很长的话题,这里已经多次讨论过;它基本上与数组如何对元素类型执行运行时检查有关,但运行时检查不能检查类型参数。长话短说,某种未经检查的警告是不可避免的(因为它确实有可能使其违反数组类型的保证)。如果你不介意“不安全”,最好的写法是使用通配类型而不是原始类型创建数组,并将其转换为适当类型的数组(是的,这是一个未经检查的转换):

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