#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
. Вам нужно найти какой-то подходящий метод для вызова или какой-то подходящий класс для использования.