我们可以在Kotlin中使用中缀泛型方法吗?

时间:2017-01-22 21:44:48

标签: generics kotlin infix-notation

编译器接受中缀+泛型方法,但使用它的语法是什么? 例如,给出这两个相同的方法(模任意泛型类型):

infix inline fun Int1.plus1(i: Int1) = Int1(this.value + i.value)
infix inline fun <U> Int1.plus2(i: Int1) = Int1(this.value + i.value)

我可以写:

Int1(3).plus1(Int1(4))
Int1(3) plus1 Int1(4)
Int1(3).plus2<Int>(Int1(4))

但此调用无效:

Int1(3) plus2<Int> Int1(4)

有人可以解释我为什么?

1 个答案:

答案 0 :(得分:4)

TL; DR是的,我们可以

首先,参数化这种方法没有意义

infix fun <U> Int.foo(i: Int) = ...

因为 foo 从不使用类型参数 U ,所以定义了调用者和参数类型

参数化方法时,您可以使用通用参数(例如

)从其signature连接类型
infix fun <U> U.foo (other: U) = ...

或至少其中一个

infix fun <U> Int.foo (other: U) = ...
infix fun <U> U.foo (other: Int) = ...

编译器会根据参数和/或调用者对象类型猜测 U 的类型

在您的情况下,编译器无法猜测 U 类型,因为它既没有连接到调用者也没有连接到参数