Могу ли я расширить 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,

Обратите внимание, что можно написать функцию расширения непосредственно на интерфейсе, это является следствием вызова другого метода, который не соответствует вашей конфигурации ввода, что приводит к его поломке.

Другие вопросы по тегам