function - 如何在 kotlin 中为泛型类型的 CloseRanged 编写迭代器?
问题描述
我正在尝试为这个泛型类编写一个迭代器:
class Point<T>(val x: T, val y: T): Comparable<Point<T>> where T: Number, T: Comparable<T> {
override fun compareTo(other: Point<T>): Int {
return compareValuesBy(this, other, Point<T>::x, Point<T>::y
)
}
}
我可以创建一系列点:val range = Point(1,1) .. Point(10.10)
. 当我调用forEach
on 时range
,它表明我必须编写一个迭代器。所以这就是我尝试过的:
operator fun ClosedRange<Point<T>>.iterator(): Iterator<Point<T>>{}
错误是“未解决的参考 T”。我应该在这里做什么?
更新:
现在工作的迭代器函数是这样的:
operator fun <T> ClosedRange<Point<T>>.iterator(): Iterator<T>
where T: Number, T: Comparable<T>
我又遇到了一个路障。我需要增加 Point 以便覆盖的next
功能可以工作。所以我有这个扩展inc
功能:
operator fun <T> Point<T>.inc(): Point<T> where T: Number, T: Comparable<T> {
return this(x + 1, y +1)
}
问题是'this(x + 1, y + 1) 不起作用,因为 x 和 y 是 T 型。你如何解决这个问题?
解决方案
您的扩展函数适用于泛型类型,因此需要声明类型参数:
class Point<T>(val x: T, val y: T): Comparable<Point<T>> where T: Number, T: Comparable<T> {
override fun compareTo(other: Point<T>): Int {
return compareValuesBy(this, other, Point<T>::x, Point<T>::y
)
}
}
operator fun <T> ClosedRange<Point<T>>.iterator(): Iterator<Point<T>> where T : Number, T: Comparable<T> {
......
}
推荐阅读
- episerver - 如何使用 Geta 站点地图排除包含文件夹中的特定子文件夹?
- ajax - 尝试通过 ajax 运行函数时不断获得 400
- angular - 如何在提交按钮中使用 routerLink
- reactjs - Antd树表按列值分组
- excel - 单击按钮时如何使表单消失?
- java - java - 如何在具有许多字段的java中创建一个不可变的类?
- javascript - Angular Firestore如何将数据保存为数组
- properties - 如何使用 java 客户端按工件中的多个属性进行过滤?
- laravel - 如何在 Laravel 上获取具有自定义列名的特定列
- android - 尝试通过接口传递布尔值时出现空指针异常