Несколько границ в Kotlin
Иногда одного ограничения T : SomeType
недостаточно: тип должен одновременно поддерживать
два интерфейса. Дополнительные границы перечисляют
в блоке where после сигнатуры функции
или класса.
Копирование в изменяемый список требует и сравнимости элементов, и возможности клонировать значение через интерфейс:
interface Copyable<T> {
fun copy(): T
}
fun <T> duplicateAll(source: List<T>, target: MutableList<T>)
where T : Comparable<T>, T : Copyable<T> {
for (item in source.sorted()) {
target.add(item.copy())
}
}
Обе строки в where должны выполняться для
конкретного T. Внутри функции можно и
сортировать, и вызывать copy:
data class Score(val points: Int) : Comparable<Score>, Copyable<Score> {
override fun compareTo(other: Score): Int {
return points.compareTo(other.points)
}
override fun copy(): Score = Score(points)
}
fun main() {
val src = listOf(Score(30), Score(10), Score(20))
val dst = mutableListOf<Score>()
duplicateAll(src, dst)
println(dst.map { it.points })
}
Объявите интерфейс с методом без аргументов,
который возвращает строковую метку. Сделайте
функцию, которая принимает список элементов,
сортирует его и выводит метки через запятую.
Используйте Comparable и ваш интерфейс
в where.
Для трех чисел 5, 1, 3
оберните их в тип, который реализует обе
границы из примера урока, скопируйте в
новый список через функцию урока и выведите
очки по порядку.