0

我想为 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 泛型的有限理解基本溢出了。我正在努力做的事情可以实现吗?我缺少的拼图是什么?

4

1 回答 1

2

您会注意到在实现中coerceAtLeast扩展函数的声明与您所拥有的有点不同:

fun <T : Comparable<T>> T.coerceAtLeast(minimumValue: T): T

如果您更改声明以匹配,它会编译。

这归结为类型的问题minimumValue。在您的版本中,不强制minimumValue' 类型实现Comparable<T>,因此它不能强制您other使用符合coerceAtLeast.

请注意,可以直接在接口上编写扩展函数,这是调用另一个与您的键入配置不匹配的方法导致此中断的结果。

于 2018-07-17T23:56:36.413 回答