【问题标题】:Kotlin - Convert Collection to Array ListKotlin - 将集合转换为数组列表
【发布时间】:2019-01-09 10:19:27
【问题描述】:

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

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

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

编译时我得到一个运行时错误,如下所示:

java.util.LinkedList 不能转换为 java.util.ArrayList

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

【问题讨论】:

  • as 是转换运算符,而不是转换运算符。使用方法调用,例如toList()

标签: kotlin arraylist


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    如果您需要修改返回的列表,您可以使用MutableList&lt;File&gt; 代替不可变的列表。

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

    如果明确需要它是一个数组列表而不是一个通用列表,一个更好的方法可能是:

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

    【讨论】:

    • 这让我类型不匹配。必需:Collection 找到:(MutableCollection..Collection?) 在 addAll
    • listFiles 方法的返回类型是什么?
    • 公共静态集合列表文件(
    • 试试:array.addAll(myFiles as Collection&lt;File&gt;) 但请记住,这不是一个完全安全的选择
    • 我已将我的 Apache Commons 版本从 1.3 更新到 2.4,它返回 Collection - 这似乎让生活变得更轻松!
    【解决方案3】:

    as 运算符是一个演员表。但是强制转换不会将值转换到给定类型;一个演员声称该值已经属于该类型。

    LinkedList 不是 ArrayList,所以当你声称它是时,计算机会因为你的错误而提醒你——正如你所见!

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

    (* 这假设您实际上需要一个 ArrayList。实际上,通常最好只引用接口,在这种情况下是 ListMutableList。根据其他 cmets,您要使用的功能调用被声明返回一个Collection;当前的实现现在可能会为你返回一个LinkedList,但这可能会改变,所以最安全的做法是不要假设它实现了这些接口中的任何一个,而是调用.toList()或@ 987654332@.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      相关资源
      最近更新 更多