You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java转Kotlin:Apache FileUtils返回集合转ArrayList报错解决方案

解决Collection转ArrayList的类型转换问题

嗨,这个问题我之前把Java代码迁移到Kotlin时也踩过一模一样的坑,刚好能帮你理清~

你遇到的java.util.LinkedList cannot be cast to java.util.ArrayList错误,核心原因是强制类型转换的逻辑不成立:
FileUtils.listFiles返回的是Collection<File>接口,但它的实际运行时实现类是LinkedList。而LinkedList和ArrayList都是List接口的子类,它们之间没有继承关系,所以直接用as ArrayList<File>做强制转换,编译时能通过(编译器只检查接口兼容性),但运行时会因为实际对象类型不匹配抛出异常。

正确的转换方式有这几种:

  1. 利用ArrayList的构造函数(最稳妥的Java/Kotlin通用方式)
    直接把Collection对象传入ArrayList的构造方法,它会自动把原集合的元素复制到新创建的ArrayList中:

    val myFiles = ArrayList(FileUtils.listFiles(mediaStorageDir, extensions, true))
    
  2. 使用Kotlin扩展函数(更简洁的Kotlin风格)
    Kotlin为集合提供了方便的扩展函数,其中toArrayList()可以直接将任意Collection转为ArrayList:

    val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true).toArrayList()
    

    如果你不需要可变集合,也可以用toList()(返回只读List,实际底层也是ArrayList);如果需要可变的List但不严格要求是ArrayList,toMutableList()也是不错的选择。

额外提醒

以后碰到接口转具体实现类的场景,尽量避免直接强制转换,除非你100%确定底层的实际实现类型。通过复制元素创建新集合的方式,既能保证类型安全,也不会破坏原集合的结构。

内容的提问来源于stack exchange,提问作者Chris Nevill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:29:25