gpt4 book ai didi

kotlin - 在 kotlin 中如何将函数引用放入数组中

转载 作者:行者123 更新时间:2023-12-02 13:08:38 29 4
gpt4 key购买 nike

具有类成员函数,例如:

private fun getData1(uuid:String): IData? {
...
}
private fun getData2(uuid:String): IData? {
...
}
private fun getData3(uuid:String): IData? {
...
}

并想放入一个函数引用数组:
var funArray = ArrayList<(uuid: String) -> IData?> (
this::getData1,
this::getData2,
this::getData3)

它不编译:
None of the following functions can be called with the arguments 
supplied:
public final fun <E> <init>(): kotlin.collections.ArrayList<(uuid: String) -> IData?> /* = java.util.ArrayList<(uuid: String) -> IData?> */ defined in kotlin.collections.ArrayList ...

如果这样做:
var funArray: ArrayList<(uuid: String) -> IData?> = ArrayList<(uuid: String) -> IData?>(3)

funArray[0] = this::getData1 //<== crash at here
funArray[1] = this::getData2
funArray[2] = this::getData3

异常崩溃
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

如何将函数引用放入数组中?

最佳答案

第一次尝试失败,因为 ArrayList没有构造函数采用(变量参数列表)值。

通过替换 ArrayList 可以获得几乎相同的效果与 listOf() (或者,如果您需要可变性, mutableListOf() ),因为它确实需要一个可变参数列表:

var functions = listOf<(uuid: String) -> IData?>(
this::getData1,
this::getData2,
this::getData3)

这也许是最自然的解决方案。 (但是, mutableListOf() 只能保证返回 MutableList 实现;它可能不是 ArrayList。)

第二次尝试失败,因为它正在构建一个空列表。

(它使用的 ArrayList constructor 带有一个名为 initialCapacity 的参数;它确保列表可以采用至少 3 个元素而无需重新分配其数组,但其初始大小为零。)

也许混淆是因为尽管您说您“想放入一个函数引用数组”, 您正在创建 List ,而不是 Array .

( ArrayList 类是 List 接口(interface)的实现,它恰好在内部使用了一个数组。这遵循 Java 将实现类命名为 <Implementation><Interface> 的约定。)

如果你需要创建一个实际的数组,你可以使用 arrayOf()在第一个例子中:
var functions = arrayOf<(uuid: String) -> IData?>(
this::getData1,
this::getData2,
this::getData3)

列表在 Kotlin 中的使用可能比数组更广泛,因为它们更灵活。 (您可以在具有不同特征的许多不同实现之间进行选择。它们更适合泛型;例如,您可以创建泛型类型的 List。您可以使它们不可变。当然,如果它们是可变的,它们可以增长和缩小。)

但是数组也有它们的位置,特别是如果性能很重要,您需要与使用数组的代码进行互操作,并且/或者大小是固定的。

关于kotlin - 在 kotlin 中如何将函数引用放入数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012489/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com