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

时间:2019-01-09 10:19:27

标签: kotlin

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

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

        val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true) as ArrayList<File>

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

  

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

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

3 个答案:

答案 0 :(得分:8)

您可以从任何ArrayList的Kotlin中轻松创建Collection

val collection = FileUtils.listFiles(mediaStorageDir, extensions, true)
val arrayList = ArrayList(collection)

答案 1 :(得分:3)

as运算符是强制转换。但是,强制类型转换不会将值转换为给定类型;演员表声称该值已经 了。

LinkedList不是ArrayList,因此当您声明是.toArrayList()时,计算机将根据您的错误将您召唤出来-如您所见!

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

(*这假设您实际上需要一个List。实际上,通常最好只引用该接口,在这种情况下为MutableListCollection。 ,则声明您正在调用的函数将返回一个LinkedList;当前的实现现在可能会为您返回一个.toList(),但这可能会发生变化,因此最安全的做法是不假定它实现了这两个接口中的任何一个,而是调用.toMutableList()dict1 = {'a': (1, 2, 3), 'b': (2, 3, 4), 'c': (3, 4, 5) 'd': (6)} dict2 = {'a': (2, 1), 'b': (3), 'c': (5, 4)} merged = merge_function(dict1, dict2) 。)

答案 2 :(得分:2)

ArrayList是具有实现详细信息的类。 FileUtils返回LinkedList,这就是您遇到问题的原因。您应该将其强制转换为List<File>,因为它是ArrayList和LinkedList都实现的接口。

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

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

如果明确需要将其作为arrayList而不是通用列表,那么更好的灵魂可能是:

val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true)
val array = arrayListOf<File>()
array.addAll(myFiles)