在科特林中如何将函数引用放入数组中
in kotlin how to put function reference in an array
具有 class 成员函数,例如:
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()
(or, if you need mutability, mutableListOf()
可以获得几乎相同的效果,因为 采用可变参数列表:
var functions = listOf<(uuid: String) -> IData?>(
this::getData1,
this::getData2,
this::getData3)
这也许是最自然的解决方案。 (但是,mutableListOf()
只能保证 return 是 MutableList
实现;它可能不是 ArrayList
。)
第二次尝试失败,因为它正在构造一个空列表。
(ArrayList
constructor 它使用一个名为 initialCapacity
的参数;它确保列表 可以 至少包含 3 个元素无需重新分配其数组,但其初始大小为零。)
可能造成混淆是因为虽然您说“想要放入一个函数引用数组”,您创建的是 List
,而不是 Array
。
(ArrayList
class 是 List
接口的实现,它恰好在内部使用数组。这遵循 Java 命名实现约定 classes 为 <Implementation><Interface>
.)
如果您需要创建一个实际的数组,您可以在第一个示例中使用 arrayOf()
:
var functions = arrayOf<(uuid: String) -> IData?>(
this::getData1,
this::getData2,
this::getData3)
在 Kotlin 中,列表可能比数组使用得更广泛,因为它们更灵活。 (您可以在具有不同特征的许多不同实现之间进行选择。它们与泛型一起工作得更好;例如,您可以创建一个 List
泛型类型。您可以使它们不可变。当然,如果它们是可变的, 它们可以变大变小。)
但是数组也有它们的位置,特别是如果性能很重要,您需要与使用数组的代码进行互操作,and/or大小是固定的。
具有 class 成员函数,例如:
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()
(or, if you need mutability, mutableListOf()
可以获得几乎相同的效果,因为 采用可变参数列表:
var functions = listOf<(uuid: String) -> IData?>(
this::getData1,
this::getData2,
this::getData3)
这也许是最自然的解决方案。 (但是,mutableListOf()
只能保证 return 是 MutableList
实现;它可能不是 ArrayList
。)
第二次尝试失败,因为它正在构造一个空列表。
(ArrayList
constructor 它使用一个名为 initialCapacity
的参数;它确保列表 可以 至少包含 3 个元素无需重新分配其数组,但其初始大小为零。)
可能造成混淆是因为虽然您说“想要放入一个函数引用数组”,您创建的是 List
,而不是 Array
。
(ArrayList
class 是 List
接口的实现,它恰好在内部使用数组。这遵循 Java 命名实现约定 classes 为 <Implementation><Interface>
.)
如果您需要创建一个实际的数组,您可以在第一个示例中使用 arrayOf()
:
var functions = arrayOf<(uuid: String) -> IData?>(
this::getData1,
this::getData2,
this::getData3)
在 Kotlin 中,列表可能比数组使用得更广泛,因为它们更灵活。 (您可以在具有不同特征的许多不同实现之间进行选择。它们与泛型一起工作得更好;例如,您可以创建一个 List
泛型类型。您可以使它们不可变。当然,如果它们是可变的, 它们可以变大变小。)
但是数组也有它们的位置,特别是如果性能很重要,您需要与使用数组的代码进行互操作,and/or大小是固定的。