Kotlin-将集合转换为数组列表

Chr*_*ill 5 kotlin

我正在将Java应用程序转换为Kotlin。在一个区域中,它使用了apache IO的FileUtils listFiles函数。

这些返回的集合,我在将集合转换/广播到ArrayList时遇到问题

        val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true) as ArrayList<File>
Run Code Online (Sandbox Code Playgroud)

在编译时,出现如下运行时错误:

java.util.LinkedList无法转换为java.util.ArrayList

将集合对象转换为ArrayList的正确方法是什么?

Eri*_*ori 19

ArrayList是一个具有实现细节的类。FileUtils正在返回 aLinkedList这就是您遇到问题的原因。您应该进行强制转换,List<File>因为它是 ArrayList 和 LinkedList 都实现的接口。

如果您需要修改返回的列表,您可以使用MutableList<File>不可变的列表。

但这不是最好的方法,因为如果FileUtils后来的创建者更改了他们集合的实现细节,您的代码可能会开始崩溃。

如果明确需要它是一个 arrayList 而不是一个通用列表,一个更好的灵魂可能是:

val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true)
val array = arrayListOf<File>()
array.addAll(myFiles)
Run Code Online (Sandbox Code Playgroud)


Abu*_*suf 17

您可以轻松地ArrayList在 Kotlin 中从任何Collection

val collection = FileUtils.listFiles(mediaStorageDir, extensions, true)
val arrayList = ArrayList(collection)
Run Code Online (Sandbox Code Playgroud)


gid*_*dds 5

as运营商是一个演员。但是强制类型转换不会转换为给定的类型。演员表声称该值已经属于该类型。

A LinkedList不是an ArrayList,所以当您声明是A 时,计算机将根据您的错误提示您-如您所见!

相反,您需要* 转换值。也许最好的方法是调用扩展功能.toArrayList()。或者,您可以显式调用构造函数:ArrayList(…)

(*假设您实际上需要一个ArrayList。在实践中,通常最好只引用该接口,在这种情况下List还是MutableList。根据其他注释,您所调用的函数被声明为返回a Collection;当前实现可能返回一个LinkedList给你了,但可能会改变,所以它是最安全,不要认为它实现了无论这些接口的,而是以电话.toList().toMutableList())。