2017-01-22 120 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

相關問題