我有一个ArrayList对象,我想动态添加ArrayLists。
但是,由于编译器在添加循环的循环之前不知道外部ArrayList中将包含哪些对象,因此我无法像往常那样使用内部ArrayLists。
我的代码看起来有点像这样:
ArrayList list = new ArrayList();
for(int i=8;i>0;i--)
{
list.add(i, new ArrayList());
}
for(int i=8;i>0;i--)
{
tileRows.get(i).add( //add other stuff );
}
如何告诉编译器list
中的项目将属于ArrayList
类型?
请记住,我是Java的新手。如果这是一个愚蠢的问题,我道歉。
答案 0 :(得分:2)
您可以声明List<Whatever>
,而Whatever
可以是支持泛型的其他界面/类,例如List<String>
,因此将所有这些放在一起就可以声明List<List<String>>
并且编译器会很高兴。根据您的上述代码:
List<List<String>> tileRows= new ArrayList<List<String>>();
for(int i=8;i>0;i--) {
list.add(i, new ArrayList<String>());
}
for(int i=8;i>0;i--) {
//here the compiler knows tileRows.get(i) is a List<String>
tileRows.get(i).add("foo");
//uncomment the below line and you will get a compiler error
//tileRows.get(i).add(new Object());
}
请记住始终program to an interface, not to a direct class implementation。
答案 1 :(得分:2)
您可以像对待任何其他类型的对象一样执行此操作。你投了它:
((ArrayList)tileRows.get(i)).add( //add other stuff );
或者更好的是,你使用泛型,所以你不必做那个演员:
//this tells the compiler that your ArrayList will contain ArrayLists
ArrayList<ArrayList<Whatever>> list = new ArrayList()<>;
//now the compiler knows the get() function returns an ArrayList, so you don't have to cast it
tileRows.get(i).add( //add other stuff );
答案 2 :(得分:2)
这是Java Generic,正确使用是这样的:
ArrayList<ArrayList> list = new ArrayList<ArrayList>();
for(int i=8;i>0;i--)
{
list.add(i, new ArrayList());
}
for(int i=8;i>0;i--)
{
tileRows.get(i).add( //add other stuff );
}
答案 3 :(得分:1)
List<List<String>> list = new ArrayList<>();
答案 4 :(得分:1)
List<ArrayList<Object>> list = new ArrayList<>();
Java 7中的