2012-08-16 21 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){}