2012-08-16 101 views
0

繼原因是在JSP頁面中的一些片段:需要的java.util.ArrayList <String>,發現java.lang.Object繼承:我不明白這個錯誤

<%! ArrayList songList = new ArrayList<String>(); %> 

    <% 
     songList = StoreSongLink.linkList; 
     // linkList is a static variable in the class StoreSongLink 
     // There the linkList is defined as public static ArrayList<String> linkList = new ArrayList<String>(); 
    %> 

<%} else { 
     for (ArrayList<String> list : songList){} 

%> 

的其他srciplet內的代碼產生錯誤required java.util.ArrayList<String> found java.lang.Object。爲什麼是這樣 ?我不明白這個原因。

爲什麼編譯器會說songList是Object類型的?

+0

它應該不是'for(Str ing l:songList)'和'ArrayList songList = ...'? – hmjd 2012-08-16 13:08:35

回答

3

你應該明確地在開始其聲明:

ArrayList<String> songList = new ArrayList<String>(); 

如果你把它聲明像這樣:

ArrayList songList = new ArrayList<String>(); 

然後你在說songListObjectArrayList s,不管=的權利是什麼。分配不會改變這一點,所以這一點:

ArrayList songList = new ArrayList<String>(); 
songList = StoreSongLink.linkList; 

不會改變的songList類型,它仍然有效ArrayList<Object>

如果修復聲明,那麼你的for循環應該是這樣的:

for (String list : songList){} 

因爲songListString列數組列表。如你所知,Java從songList中提取每個Object,並嘗試將它分配給你在:左邊聲明的內容,你告訴它它是ArrayList<String>。它不能將Object轉換爲ArrayList<String>(特別是因爲Object其實只是下面的String),所以會引發錯誤。

+0

我爲什麼要在上面聲明?這個調用'songList = storeSongLink.linkList;'取得相同的 – 2012-08-16 13:17:31

+0

爲什麼編譯器說'songList'是Object類型? – 2012-08-16 13:22:00

+0

@SuhailGupta爲了清晰起見編輯答案。是否有意義? – davidfmatheson 2012-08-16 14:19:34

0

用途:

for (String s: songList) { 
    // etc. 
} 

還要確保StoreSongLink.linkListArrayList<String>類型。

0
for (ArrayList<String> list : songList){} 

必須

for (Object list : songList){} 

因爲的SongList聲明的類型是ArrayList的(等於ArrayList的)

0

當您爲songList分配一個新的ArrayList時,您將songList定義爲arrayList(即arrayList)。這將使得將歌曲列表作爲對象迭代是可以的。但是你實際上正在迭代songList作爲ArrayList。

因此,總之,您需要將songList切換爲ArrayList,並且需要使用Strings而不是ArrayList來遍歷songList。

0

ArrayList正如您可能知道的那樣,在未使用參數化ArrayList<E>聲明時,它是原始類型。所以你有效它轉向的Object數組列表,而不是String,用你的初始化:
ArrayList songList = new ArrayList<String>();

2
for (ArrayList<String> list : songList){} // Error is here 

而且你必須定義對象類型的ArrayList中的參考和聲明一個String類型的ArrayList實例,它應該是ArrayList<String> songList = new ArrayList<String>();ArrayList<String> songList = new ArrayList();(僅支持的Java 7)

所以更正代碼也能像 -

<%! List<String> songList = new ArrayList<String>(); %> 
... 
for (String list : songList){ 
} 
+0

,但是這個調用'songList = StoreSongLink.linkList;'也是一樣的 – 2012-08-16 13:18:44

+0

爲什麼它說'songList'是類型對象? – 2012-08-16 13:20:22

+0

@SuhailGupta - 當創建ArrayList 時,如果未定義類型(E),則它已被授予Object(SuperType)。並且您定義的引用ArrayList 可以保存該類型的對象或該類型的對象的子類型。定義列表類型總是很好的方法。 – 2012-08-16 13:26:43

0

你的迭代是錯誤的

for (ArrayList<String> list : songList){} 

songList包含String元素的列表中沒有的ArrayList<String>

列表,所以你需要重複這樣for (Object song: songList){}

ArrayList<String> songList = new ArrayList<String>(); 
for (String song: songList){}