加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:38:57 所属栏目:Java 来源:网络整理
导读:这是一个简单的泛型方法,并且将forgs中的args传递给for循环会导致错误: for-loop range must have and iterator() method fun main(args: ArrayString) { val arr: IntArray = intArrayOf(1,2,3,4) val charA: CharArray = charArrayOf('a','b','c','d') pr
这是一个简单的泛型方法,并且将forgs中的args传递给for循环会导致错误:

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 []和数组的值

解决方法

Kotlin中的for循环按惯例工作,静态地查找名为iterator的运算符成员,该运算符成员必须返回可以迭代的东西,即依次包含operator和hasNext的东西.

这些成员上的operator修饰符需要指定该成员是否满足某些约定,即迭代约定.

由于args的类型为T,并且在每种可能的类型T中都没有迭代器成员,因此无法轻易迭代.

但是,您可以为printMe提供一个附加参数,它知道如何从T实例中获取迭代器,然后使用它来获取迭代器并迭代它:

fun main(args: Array<String>) {
    val arr: IntArray = intArrayOf(1,'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.() – >迭代&LT * GT;是一个表示function with receiver的类型.可以在T上调用该类型的实例,就像它们是它的扩展一样.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读