java - Kotlin:通用方法和 for 循环要求迭代器()

标签 java generics kotlin

这是一个简单的通用方法,将值传递给 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 的运算符成员它必须返回可以迭代的东西,即依次具有运算符成员的东西 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)
    }
}

在这里T.() -> Iterator<*>是一种表示 function with receiver 的类型.可以在 T 上调用该类型的实例就好像它们是它的扩展。

这段代码之所以有效,是因为返回的迭代器本身有一个运算符扩展函数 Iterator<T>.iterator() = this它只返回该迭代器,因此允许使用 for 循环遍历迭代器。

关于java - Kotlin:通用方法和 for 循环要求迭代器(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44251647/

相关文章:

java.lang.IllegalStateException : Activity has been destroyed -- Android fragment 错误

c# - 如何根据其属性检查 <T> 列表是否具有顺序(升序或降序)?

swift - 如何将此函数转换为泛型类型?

kotlin - 如何在Kotlin中用单行值声明列表?

java - java画圆和长方形

java - Hibernate 双向映射

java - 删除自定义按钮上的边框

c# - Entity Framework - 一般持久化枚举?

java - 即使未在构建方法中声明变量,setState 也不会更新 UI

android - 为什么没有通过回收站 View 测试?