List<ArrayList<Planet>> NAME = new ArrayList<ArrayList<Planet>>(N);
List<List<Planet>> NAME = new ArrayList<ArrayList<Planet>>(N);
ArrayList<ArrayList<Planet>> NAME = new ArrayList<ArrayList<Planet>>(N);
我无法说出这三种表情的区别。后来我才意识到List可能用于声明,因为它是一个接口而ArrayList
可以用于启动,因为它是一个类。我在项目中使用了第一个语法并找到了
发现:java.util.ArrayList&gt;
必需:java.util.ArrayList&gt;
List<List<Planet>> Name = new ArrayList<ArrayList<Planet>>(N);
我在标题中添加了。
import java.util.ArrayList;
import java.util.List;
在另一个地方,我将Planet
对象添加到ArrayList
:
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) continue;
NAME[i].add(planets[j]);
}
}
编译器报告,
需要数组,但是java.util.ArrayList&gt;结果
planetsForNetForceSetting[i].add(planets[j]);
有人可以告诉我这个的原因吗?
答案 0 :(得分:3)
您正尝试从List
的指定位置检索数据,例如Array
,NAME[i].add(planets[j]);
,无法完成的任务。
要从ArrayList
获取数据,您必须使用get(int)
方法。这样:NAME.get(i)
代替NAME[i]
。
然后,您的方法必须
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) continue;
NAME.get(i).add(planets[j]);
}
}
关于三个表达式的区别,以及为什么使用接口来声明List<Object> list = new ArrayList<Object>
而不是类本身look at this question。
答案 1 :(得分:1)
在你的3个表达式中,按照你提到的顺序,第二个是最通用的,然后是第一个,然后是第三个。
这意味着当您使用List<Planet> listObj
时,您可以使用listObj
指向List
接口的任何实现。当您执行ArrayList<Planet> listObj
时,您可以使用listObj
仅指向ArrayList
类型的对象
无论是1维还是N维,这都是正确的。
更通用的类型和首选的类型将使用List<Object> listObj
,这意味着您可以使用listObj
指向List
接口的任何实现,您也可以在列表中使用可以放任何物体。当您使用List<Planet> listObj
时,您只能放置Planet
个对象。
对于编译问题,你的代码不足以找出根本原因,因为我看不到什么planetsForNetForceSetting
,只是确保你把正确的对象放在正确的位置。就像我上面解释的那样。
希望这有帮助!!!
答案 2 :(得分:1)
第一个List<T>
是一个按类型T
参数化的java接口。 ArrayList<T>
是接口List<T>
的具体实现。因此,您可以指定List<Integer> list = new ArrayList<Integer>();
这样,变量list
的类型List<Integer>
会隐藏特定的实现ArrayList<T>
。
然后是以下几行:
List<ArrayList<Planet>> planetsList = new ArrayList<ArrayList<Planet>>();
创建planetsList
类型的变量List<ArrayList<Planet>>
,它是数组列表的列表。实际的外部列表实现是ArrayList<ArrayList<Planet>>
。
List<List<Planet>> planetsList2 = new ArrayList<ArrayList<Planet>>();
无法编译,因为您无法将ArrayList<ArrayList<Planet>>
分配给List<List<Planet>>
请参阅此问题以更深入地解释原因Why can't you have a "List<List<String>>" in Java?
ArrayList<ArrayList<Planet>> planetsList3 = new ArrayList<ArrayList<Planet>>();
将创建类型为planetsList3
的变量ArrayList<ArrayList<Planet>>
。
您需要同时导入java.util.List
和java.util.ArrayList
类型,因为您在代码中直接引用它们。
最后。您不能通过数组索引语法items[index]=item;
将项目分配给列表索引,因为List<ItemType> items;
是接口而不是数组。这些在java中完全不同。