Могу ли я расширить Comparable<T> в Kotlin?
Я хотел реализовать min()
/max()
псевдонимы для котлина Comparable<T>coerceAtLeast()
/coerceAtMost()
если ничего больше для расширения интерфейса (я пока только расширенные классы).
Я попробовал это:
fun <T>Comparable<T>.max(other:T) : T {
return this.coerceAtLeast(other)
}
Но я получаю следующую ошибку:
Type inference failed: Cannot infer type parameter T in fun <T : Comparable<T#1 (type parameter of kotlin.ranges.coerceAtLeast)>> T#1.coerceAtLeast(minimumValue: T#1): T#1
None of the following substitutions
receiver: Any? arguments: (Any?)
receiver: Comparable<T#2 (type parameter of com.nelsonirrigation.twig.plans.extensions.max)> arguments: (Comparable<T#2>)
receiver: T#2 arguments: (T#2)
receiver: Comparable<Comparable<T#2>> arguments: (Comparable<Comparable<T#2>>)
can be applied to
receiver: Comparable<T#2> arguments: (T#2)
На этом этапе мое ограниченное понимание дженериков Kotlin в основном переполнилось. То, что я пытаюсь сделать, достижимо? Какой кусок головоломки мне не хватает?
1 ответ
Вы заметите в реализацииcoerceAtLeast
что объявление функции расширения немного отличается от того, что у вас есть:
fun <T : Comparable<T>> T.coerceAtLeast(minimumValue: T): T
Если вы измените объявление, чтобы оно совпадало, оно компилируется.
Это сводится к проблеме типа minimumValue
, В вашей версии не обязательно minimumValue
Тип орудия Comparable<T>
так что это не может принуждать вас other
к типу, который соответствует договору coerceAtLeast
,
Обратите внимание, что можно написать функцию расширения непосредственно на интерфейсе, это является следствием вызова другого метода, который не соответствует вашей конфигурации ввода, что приводит к его поломке.