我正在将Java应用程序转换为Kotlin。 在一个区域中,它使用了apache IO的FileUtils listFiles函数。
这些返回集合,我在将集合转换/广播到ArrayList时遇到问题
val myFiles = FileUtils.listFiles(mediaStorageDir, extensions, true) as ArrayList<File>
在编译时,出现如下运行时错误:
java.util.LinkedList无法转换为java.util.ArrayList
将集合对象转换为ArrayList的正确方法是什么?
答案 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
。实际上,通常最好只引用该接口,在这种情况下为MutableList
或Collection
。 ,则声明您正在调用的函数将返回一个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)