2014-02-24 28 views
1

我有一個ArrayList對象,我想動態添加ArrayLists。ArrayList的ArrayList,如何使用內部列表?

但是,由於編譯器不知道在添加它們的循環運行之前哪些對象將在外部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完全陌生。如果這是一個愚蠢的問題,我很抱歉。

回答

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

+0

謝謝你,這正是我所追求的。我懷疑這會是這樣簡單的事情。 – Obversity

1
List<List<String>> list = new ArrayList<>(); 
1
List<ArrayList<Object>> list = new ArrayList<>(); 

在Java 7中

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

這是Java的泛型,以及正確的使用方法是一些這樣的:

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); 
}