Как вы пишете итератор для более близкой версии универсального типа в котлине?

#function #kotlin #generics

Вопрос:

Я пытаюсь написать итератор для этого универсального класса:

 
    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 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>

 

Я столкнулся с еще одним препятствием на дороге. Мне нужно увеличить точку, чтобы переопределенная next функция могла работать. Поэтому у меня есть эта inc функция расширения:

 
    operator fun <T> Point<T>.inc(): Point<T> where T: Number, T: Comparable<T> {
        return this(x   1, y  1)
    }

 

Проблема в том, что » это(x 1, y 1) не работает, потому что x и y относятся к типу T. Как вы можете обойти это?

Комментарии:

1. должны ли вы к тому времени определить значение T ? если я вас неправильно понял, вы можете добавить больше контекста?

Ответ №1:

Ваша функция расширения предназначена для универсального типа, поэтому необходимо объявить параметры типа:

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

Комментарии:

1. Здорово. Премного благодарен. Я обновил свой вопрос. Пожалуйста, помогите.

2. Это другой вопрос. оператор не определен вкл Number . Вам нужно найти какой-то подходящий метод для вызова или какой-то подходящий класс для использования.