这是一个简单的通用方法,将值传递给 for 循环中的 args 会导致错误提示:
for-loop range must have and iterator() method
fun main(args: Array<String>) {
val arr: IntArray = intArrayOf(1,2,3,4)
val charA: CharArray = charArrayOf('a','b','c','d')
printMe(arr)
printMe(charA)
}
fun <T>printMe(args: T){
for (items in args){
println(items)
}
}
我如何让它遍历 char[]
和 array
最佳答案
Kotlin 中的 for-loop 按照惯例工作,静态查找名为 iterator
的运算符成员它必须返回可以迭代的东西,即依次具有运算符成员的东西 next
和 hasNext
.
operator
此类成员的修饰符需要指定该成员满足某种约定,即迭代约定。
自 args
类型为 T
并且没有 iterator
各种可能类型的成员 T
, 它不能轻易迭代。
但是您可以为 printMe
提供一个附加参数,它知道如何从 T
的实例中获取迭代器, 然后用它得到一个迭代器并迭代它:
fun main(args: Array<String>) {
val arr: IntArray = intArrayOf(1,2,3,4)
val charA: CharArray = charArrayOf('a','b','c','d')
printMe(arr, IntArray::iterator)
printMe(charA, CharArray::iterator)
}
fun <T> printMe(args: T, iterator: T.() -> Iterator<*>) {
for (item in args.iterator()) {
println(item)
}
}
在这里T.() -> Iterator<*>
是一种表示 function with receiver 的类型.可以在 T
上调用该类型的实例就好像它们是它的扩展。
这段代码之所以有效,是因为返回的迭代器本身有一个运算符扩展函数 Iterator<T>.iterator() = this
它只返回该迭代器,因此允许使用 for 循环遍历迭代器。
关于java - Kotlin:通用方法和 for 循环要求迭代器(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44251647/