首页 > 解决方案 > 如何在 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). 当我调用forEachon 时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 型。你如何解决这个问题?

标签: functionkotlingenerics

解决方案


您的扩展函数适用于泛型类型,因此需要声明类型参数:

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> {
    ......
}

推荐阅读