如果我可以声明一个FloatLists数组:FloatList [][] values = new FloatList[3][3];
为什么不像这样声明一个包含FloatLists的ArrayLists数组:ArrayList<FloatList> [][] values = new ArrayList<FloatList>() [3][3];
?或者偶然:ArrayList<FloatList> [][] values = new ArrayList<FloatList> [3][3]();
如何实现这一目标?是否很难引用埋藏在其硬壳质地下的floats
?
答案 0 :(得分:2)
从最内层类型到最外层类型。您从FloatList
开始:
FloatList
然后将其包装在ArrayList
:
ArrayList<FloatList>
然后你需要一个数组:
ArrayList<FloatList>[]
或2D数组:
ArrayList<FloatList>[][]
它为您提供声明的类型,但是您必须通过为变量赋值来初始化变量。从数组开始,给它一个大小:
ArrayList<FloatList>[] array = new ArrayList[10];
这为您提供了一组ArrayList<FloatList>
个对象,但它们的开头为null
。要为它们提供值,您需要遍历数组中的每个索引,并使用new
关键字将索引的值设置为ArrayList<FloatList>
的实例:
for(int i = 0; i < array.length; i++){
array[i] = new ArrayList<FloatList>();
}
对于2D数组,只需在嵌套的for
循环中使用相同的逻辑。
然后在数组的特定索引处向FloatList
添加ArrayList
,您可以这样做:
array[i].add(new FloatList());
最后,要将float
添加到数据中索引的FloatList
中的ArrayList
,您可以这样做:
array[x].get(y).append(0.5);
要从数组中索引的float
FloatList
中的索引中获取ArrayList
,您可以这样做:
float f = array[x].get(y).get(z);
总而言之,它看起来像这样:
ArrayList<FloatList>[] array = new ArrayList[10];
for(int i = 0; i < array.length; i++){
array[i] = new ArrayList<FloatList>();
}
array[1].add(new FloatList());
array[1].get(0).append(0.25);
array[1].get(0).append(0.5);
array[1].get(0).append(0.75);
float f = array[1].get(0).get(2);
println(f);
答案 1 :(得分:1)
ArrayList
基本上,您声明您想要的对象是ArrayList
的3D数组,而不是生成实际的values[0][0] = new ArrayList<>();
个对象。
之后,你必须实例化每一个,例如:
dependencies {
compile 'org.restlet.jse:org.restlet:2.3.7'
compile 'org.restlet.jse:org.restlet.ext.jsslutils:2.3.7'
}
等等。
答案 2 :(得分:0)
由于JVM提供泛型的方式,它不起作用。 Java中的泛型是一种前端编译器功能,它在执行时成为原始类型用法和强制转换。
使用泛型时编译器在做什么?
这是一个非常人为的例子。让我们说我想创建一个List<String>
来存储命令行参数,我稍后会用它来启动一个新进程,如下所示:
List<String> cmd = new ArrayList<>();
cmd.add("java");
cmd.add("-jar");
cmd.add("path/to/my.jar");
...
String args = cmd.get(0)+" "+cmd.get(1)+" "+cmd.get(2);
在编译时,编译器将检查以确保每次我通过String
使用通用List
方法时使用cmd
类型,如果我尝试则抛出错误使用不兼容类型的实例。但是,在编译期间,执行之前会发生一个名为擦除的小事。有效地,编译器将上面的代码转换成如下代码:
List cmd = new ArrayList();
cmd.add("java");
cmd.add("-jar");
cmd.add("path/to/my.jar");
...
String args = (String)cmd.get(0)+" "+(String)cmd.get(1)+" "+(String)cmd.get(2);
那么为什么我的通用数组代码没有编译?
在您的示例中,您希望创建一个泛型类型的数组,如下所示:
ArrayList<FloatList>[][] array = new ArrayList<FloatList>[n][m]; //Doesn't compile? What gives?
问题是,由于类型擦除,ArrayList<FloatList>
类类型确实不存在,现在您已经要求JVM创建一个不存在的二维数组类型。
好的,那么替代方案是什么?
嗯......它不漂亮,但你可以这样做:
class ArrayListOfFloatList extends ArrayList<FloatList>{
...
}
//Somewhere else in your code:
ArrayListOfFloatList[][] myArray = new ArrayListOfFloatList[n][m];
//This will compile because ArrayListOfFloatList is a real class.
唯一的另一种方法是不使用数组。或许很难看,但不幸的是,它目前是如何实现Java的限制。