繁体   English   中英

我应该如何在 Kotlin 中设置 asList 的返回类型?

[英]How should I set the return type of asList in Kotlin?

在此处输入图片说明 我正在学习,同时将用Java编写的代码更改为Kotlin

但我对在Java使用Arrays.asList List collection感到困惑。

当我将返回类型设置为List<String>asList会引发错误。

asList的文档中,返回类型是 List,为什么不允许呢?

IDE ,解决方法是将返回类型更改为MutableList<Array<String>>? 现在.. MutableList<Array<String>>? 的意义是什么

不仅仅是一个 MutableList,Mutable<ArrayList> 是什么意思?

List , MutableList , ArrayList .. 我不知道适合哪个

枚举类

enum class BodyType(_resourceId: Int) {
    CHEST(R.array.chest_workout_list),
    BACK(R.array.back_workout_list),
    LEG(R.array.leg_workout_list),
    SHOULDER(R.array.shoulder_workout_list),
    BICEPS(R.array.biceps_workout_list),
    TRICEPS(R.array.triceps_workout_list),
    ABS(R.array.abs_workout_list);

    @ArrayRes
    private val resourceId: Int = _resourceId


    fun getResourceId() : Int = resourceId
}

界面

interface WorkoutListSource  {
    fun getWorkoutListByPart(type: BodyType) : ArrayList<String>?
}

WorkoutListLocalSource.kt

class WorkoutListLocalSource(_resources: Resources) : WorkoutListSource {
    private val resource: Resources = _resources

    override fun getWorkoutListByPart(type: BodyType): ArrayList<String>? {
        Arrays.sort(resource.getStringArray(type.getResourceId()))
        return Arrays.asList(resource.getStringArray(type.getResourceId()))
    }
}

Arrays.asList是一个 Java stdlib 函数,它接受一组vararg参数并将它们转换为一个列表。 如果你像你这样传递一个Array<String> ,它会返回一个大小为 1 的List<Array<String>>

要使其与此 Java 标准库方法一起使用,您需要使用扩展运算符* 我把它分成两行以使其更清楚。

val array = resource.getStringArray(type.getResourceId())
return Arrays.asList(*array)

在 Kotlin 中,使用 Kotlin 标准库函数会更简洁一些:

val array = resource.getStringArray(type.getResourceId())
return arrayListOf(*array)

如果您不需要 ArrayList 并且可以返回 MutableList,则更简单,但您需要重新定义接口函数的返回类型:

return resource.getStringArray(type.getResourceId()).toMutableList()

当您不需要从外部修改从任何获取它的函数返回的列表时,只读列表应该优先于 ArrayList/MutableList。 如果您遵循良好的 OOP 原则,情况几乎总是如此。 因此,如果您将接口的返回类型更改为List ,则可以使用 Kotlin stdlib 的asList()来获取包装数组的 List 而不是像arrayListOf()toMutableList()toList()那样复制它:

return resource.getStringArray(type.getResourceId()).asList()

您的其他问题在此处的文档中得到解答。 但基本上(Mutable)List意味着您可以将 Java 中的类型视为 MutableList 或只读列表。 编译器无法区分,因为 Java 没有只读列表。 一些 Java 方法返回不可变的列表,当您尝试改变它们时会抛出异常。 您可以查看该方法的文档以确定将其视为 MutableList 是否安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM