Java for-each访问List集合显示错误: for-each 不适用于表达式类型 5C
class ImageDropTargetListener extends DropTargetAdapter    //这是内部类,有些变量已经定义好了
{
    public void drop(DropTargetDropEvent e)
    {
        e.acceptDrop(DnDConstants.ACTION_COPY);
        Transferable transfer = e.getTransferable();
        DataFlavor[] flavor = transfer.getTransferDataFlavors();
        for(int i=0; i<flavor.length; i++)
        {
            DataFlavor d = flavor[i];
            try
            {
                if(d.equals(DataFlavor.javaFileListFlavor))
                {
                    List fileList = (List)transfer.getTransferData(d);
                    for (Object obj : fileList)      //问题报错在这
                    {
                        showImage((File)obj, e);    //已经定义好的方法
                    }
                }
            }
            catch (Exception event)
            {
                event.printStackTrace();
            }
            e.dropComplete(true);
        }
    }
}

错误: for-each 不适用于表达式类型
for (Object obj : fileList)
^
要求: 数组或 java.lang.Iterable
找到: List
哪位大神教一下,为什么会错……
难道是下面这句有问题???
List fileList = (List)transfer.getTransferData(d);

12个回答

Linux系统中的每个进程都有一个父进程(init进程除外);每个进程还有0个或多个子进程。在进程描述符中parent指针指向其父进程,还有一个名为children的子进程链表(父进程task_struct中的children相当于链表的表头)。

而我们可以使用list_for_each(/include/linux/list.h)来依次遍历访问子进程:

struct task_str......
答案就在这里:list_for_each
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

: 这个运算符从未见过,换成别的符号试试。

QQ919769936
天下莫柔于风 用来遍历集合的
4 年多之前 回复
QQ919769936
天下莫柔于风 额……强化的for循环
4 年多之前 回复

: 这个运算符从未见过,换成别的符号试试。

for 改成foreach,好像是1.7才支持那种格式替代foreach

楼主,说错了,你这个写法是对的,没有你具体的代码环境,目前看不出什么问题

QQ919769936
天下莫柔于风 问题报错在这个内部类里面,这就是内部类的全部代码,难道是java没有把fileList当成List才认为这样使用for-each错误
4 年多之前 回复
QQ919769936
天下莫柔于风 安装的是Java1.8,是可以向下兼容的呀
4 年多之前 回复

transfer.getTransferData
这个获得的数据类型应该不是List,所以才会进行一次类型转换是吧,如果获得的类型是一个集合的话,可以获得它的iterator,然后进行遍历这个样子,如果不是集合类型,那么类型转换出错肯定是必然的。

LiynGu
liyngu 容我再多几句废话,最好把返回值类型说一下,如果有可能的话看一下它是否继承自Collection,一般情况下,如果只是遍历,直接用迭代器就行,如果需求是要一个list的话,一般是先new 一个list,然后调用addAll把整个集合加进去,不要强转,就这样了。
4 年多之前 回复
LiynGu
liyngu 强制转换肯定是会成功的,就像你把一个int塞进一个list的盒子里,肯定是会成功,但这个int肯定不会具有list的特性,就好比是你把一个鸡蛋打碎,装到一个鸭蛋的壳里面,吃起来肯定还是鸡蛋的味道对吧。 foreach的原理就是取出集合中的迭代器,然后去执行hasNext 和next方法进行迭代,你这是把根本不知道是什么类型的东西放在了list的盒子里,但这个盒子里肯定没有迭代器,所以就报错了…… 还有,一般情况下,如果不能确定返回值类型的话,最好不要用强转,转换之前可以用instanceof判断下类型再转……
4 年多之前 回复
QQ919769936
天下莫柔于风 List fileList = (List)transfer.getTransferData(d);已经强制转换成List了呀,我怀疑是转换不成功,但是没成功的话编译这里又没报错
4 年多之前 回复

transfer.getTransferData(d)这个原来是什么类型的?

BestwishesTolover
BestwishesTolover 回复天下莫柔于风: 既然是对象,为什么不List<对象> filelist = transfer.getTransferData(d),然后for(对象 obj:filelist){}
4 年多之前 回复
QQ919769936
天下莫柔于风 d是DataFlavor类型的,getTransferData()返回的就是一个对象,该对象表示将要被传输的数据。
4 年多之前 回复

List fileList = (List)transfer.getTransferData(d);
这句话不管transfer.getTransferData(d)是什么对象,都能进行强制转换,编译是不会报错的,强制转换异常是运行时异常。
这样写应该是可以的,确认一下你的List全名是否是java.util.List

List fileList = (List)transfer.getTransferData(d);
这句话不管transfer.getTransferData(d)是什么对象,都能进行强制转换,编译是不会报错的,强制转换异常是运行时异常。
这样写应该是可以的,确认一下你的List全名是否是java.util.List

楼主,你确定引入的是import java.util.List;
???

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问