2017-01-22 79 views
6

编译器接受infix +泛型方法,但是使用它的语法是什么? 实施例,所给出的那些2层相同的方法(模任意通用型):我们可以在Kotlin中使用infix通用方法吗?

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) 

有人能解释我为什么?

回答

4

TL; DR是的,我们可以

首先,有一个在参数化这样的方法

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

因为从不使用类型参数没有一点ü,无论主叫和参数类型定义

当你参数化一个方法时,你从它的signature类型中连接了一个泛型参数,如

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

或它们中的至少一个

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

编译器会猜测ü由参数和/或呼叫者的对象类型

在你的情况编译器类型不能猜测ù键入,因为它既没有连接到呼叫者也没有连接参数

+0

但让我们说你有一个'Int2'类来扩展'Int1'。然后你有这个函数:'infix inline fun U.print(i:Int)= println(“$ {U :: class} $ i”)'。如果你想让'U'成为'Int1',你可以这样调用它:'Int2(5).print (4)'。是否可以使用中缀表示法进行此调用? – marstran

+0

@marstran是的,你必须把它的参数转换为预期的类型 'Int2(5)print 4.to(Int1 :: class)' –

+0

这是行不通的。这个论点是一个普通的“Int”。这是'U'型接收机,这是问题所在。我是否必须演员呢?似乎有点奇怪,我只有在处理中缀函数时才需要使用投射。 – marstran

相关问题