Kotlin:泛型方法和for循环请求iterator()

Waq*_*der 3 java generics kotlin

这是一个简单的泛型方法,并且将forgs中的args传递给for循环会导致错误:

for循环范围必须有和iterator()方法

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何使它迭代两个char[]和的值array

Ily*_*lya 5

for循环在科特林工作按照惯例,寻找静态名为操作员iterator必须返回的东西,可以重复,即东西,反过来又运营商成员nexthasNext.

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

T.() -> Iterator<*>是一种表示带接收器功能的类型.可以调用该类型的实例,就T好像它们是它的扩展一样.

返回的迭代器本身就是一个操作符扩展函数Iterator<T>.iterator() = this,只返回迭代器,因此允许循环使用for循环遍历迭代器.