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
for循环在科特林工作按照惯例,寻找静态名为操作员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)
}
}
Run Code Online (Sandbox Code Playgroud)
这T.() -> Iterator<*>是一种表示带接收器功能的类型.可以调用该类型的实例,就T好像它们是它的扩展一样.
返回的迭代器本身就是一个操作符扩展函数Iterator<T>.iterator() = this,只返回迭代器,因此允许循环使用for循环遍历迭代器.
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |