[英]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.