Java转Kotlin:Apache FileUtils返回集合转ArrayList报错解决方案
嗨,这个问题我之前把Java代码迁移到Kotlin时也踩过一模一样的坑,刚好能帮你理清~
你遇到的java.util.LinkedList cannot be cast to java.util.ArrayList错误,核心原因是强制类型转换的逻辑不成立:FileUtils.listFiles返回的是Collection<File>接口,但它的实际运行时实现类是LinkedList。而LinkedList和ArrayList都是List接口的子类,它们之间没有继承关系,所以直接用as ArrayList<File>做强制转换,编译时能通过(编译器只检查接口兼容性),但运行时会因为实际对象类型不匹配抛出异常。
正确的转换方式有这几种:
利用ArrayList的构造函数(最稳妥的Java/Kotlin通用方式)
直接把Collection对象传入ArrayList的构造方法,它会自动把原集合的元素复制到新创建的ArrayList中:val myFiles = ArrayList(FileUtils.listFiles(mediaStorageDir, extensions, true))使用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

