翻譯說明:安全
原標題: Parameters and Arguments: An Easy Way to Remember the Differenceapp
原文地址: typealias.com/guides/para…ide
原文做者: Dave Leeds函數
最近在深刻研究Kotlin中的泛型語法,發現它和Java中的泛型有着很大不一樣,在語法上Kotlin的泛型也會比Java中的使用起來更安全。可是發現Kotlin泛型一時間冒出了不少的名詞術語,什麼協變、逆變、不變、星投影啊;什麼實化參數、類型形參、類型實參啊,什麼類、類型、子類、子類型、超類型弄得是一臉懵逼. 不過還好基本都弄懂了,因而乎想準備一系列關於Kotlin中泛型的博客來記錄個人坎坷,但願能有所幫助。post
如下是我以前的一些關於Kotlin的文章,如感興趣歡迎查看:ui
翻譯系列:spa
原創系列:插件
實戰系列:翻譯
今天是一篇簡單的博客翻譯做爲Kotlin泛型語法系列開場白:3d
你是否曾經很難記住形參和實參的區別,今天這篇文章就是爲了量身打造的。理清它們之間的區別能夠幫助你更好地深刻理解函數,此外甚至能夠更多幫助你理解泛型。
回憶二者之間的差別的最簡單的簡單的方法就是將arugment單詞與outside單詞關聯起來,記住這句話
「Take your argument outside!」
這裏有我畫的一張卡通圖幫你去記住它:
有關更多說明,讓咱們看一下函數和泛型類的示例。
這是一個對整數進行平方的簡單函數。將傳遞哪些數據?只是咱們想要平方的數字。
fun square(number: Int): Int {
return number * number
}
複製代碼
在這個函數的定義裏面,咱們說number就是一個形式參數。
如今已經定義好了咱們的函數,當咱們調用它時,會將一些數據傳遞給這個函數。
val radius = 5
val area = Math.PI * square(radius)
複製代碼
這裏,在函數定義的外面,咱們說radius是square函數的實際參數。
泛型類是具備一種或多種類型的類。例如,這裏有個很是簡單的Box
類,它只包含其餘一些對象。
class Box<T>(var item: T)
複製代碼
這裏,在Box類定義的裏面,咱們說T
是一個類型形參。
使用這個類十分簡單,咱們只須要調用它的構造器,並傳入一些符合正確類型的數據進去便可。
val box = Box<String>("Hello")
複製代碼
這裏,在Box類定義的外面,咱們使用String
類型實參去構造它。
事實上,Kotlin作了一些智能的類型推導,因此咱們甚至沒必要明確指定它:
val box = Box("Hello")
複製代碼
在這種狀況下,它仍然有一個String
類型的類型實參。它只是隱含在咱們傳遞給構造函數的「Hello」實際參數的類型中而已。
再次說明下,在函數和泛型類/接口兩種狀況下,結論是:
其實這篇文章目的很簡單就是幫助理解一個問題:Kotlin中泛型形參和實參區別。由於這兩個術語將會在後續泛型文章中被屢次提到。因此若是不提早弄懂這些名詞概念,後面一些深刻的東西理解起來會很是吃力的。我補充幾點:
class StringList: List<String>{
...
}
複製代碼
對於以上例子很好理解,StringList類實現List接口,提供了具體的類型實參: String,能夠看到String明顯是在List接口定義的外面,因此它就是類型實參
class ArrayList<T>: List<T>{
...
}
複製代碼
關於這個例子,你們看看怎麼分析呢?? 實際上很簡單就按照這篇文章做者說的那樣抓住問題關鍵點: 類型參數在類或接口定義外面仍是裏面,裏面就是形參,外面就是實參
因此,這裏例子很容易分析出這個T是List接口的類型實參,而不同的是這個T同時仍是ArrayList這個類的類型形參。ArrayList類中定義了本身的類型形參T,並把指定爲父類(List接口)類型的實參。在Kotlin的泛型中有這樣規定: 若是一個類繼承泛型類(或者實現了泛型接口),就必須爲基礎類型的泛型形參指定一個泛型實參。它能夠是具體的類型或者另外一個類型形參。因此你會發現ArrayList 中的T和List中的T實際上有所不同的,就是類型形參和類型實參的區別。
這是泛型系列文章簡單的開場白,下面將會繼續深刻Kotlin泛型相關內容,例如泛型擦除以及實化類型參數,泛型協變,逆變,星投影。歡迎繼續關注~~
歡迎關注Kotlin開發者聯盟,這裏有最新Kotlin技術文章,每週會不按期翻譯一篇Kotlin國外技術文章。若是你也喜歡Kotlin,歡迎加入咱們~~~