编译器接受中缀+泛型方法,但使用它的语法是什么? 例如,给出这两个相同的方法(模任意泛型类型):
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)
有人可以解释我为什么?
答案 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 类型,因为它既没有连接到调用者也没有连接到参数