[譯] 一個簡單方式教你記住Kotlin的形參和實參

翻譯說明:安全

原標題: 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實際上有所不同的,就是類型形參和類型實參的區別。

  • 第2、初學者很容易走進一個誤區,認爲相似T,K,V這種沒有具體意義的類型就是類型形參,而像String,Int這種具體有意義的類型就是類型實參。這種理解是錯誤,總之能夠按照原文做者那樣理解。
  • 第三,在Kotlin中規定全部的泛型實參須要顯示的聲明,要麼能被編譯器智能推導出來。也就是不能像Java中那樣直接一個List(Java中原生態類型)就行,不用指定泛型實參,這種狀況在Kotlin中不容許的,編譯器就會報錯。因此不得不誇下Kotlin了,它語法上很是嚴謹和明確,不能含糊,在定義和聲明就必須明確下來。
  • 第四,泛型函數中也有本身的類型形參,在每次函數執行調用時類型形參會被替換成類型實參,有點函數中形參和實參。

這是泛型系列文章簡單的開場白,下面將會繼續深刻Kotlin泛型相關內容,例如泛型擦除以及實化類型參數,泛型協變,逆變,星投影。歡迎繼續關注~~

歡迎關注Kotlin開發者聯盟,這裏有最新Kotlin技術文章,每週會不按期翻譯一篇Kotlin國外技術文章。若是你也喜歡Kotlin,歡迎加入咱們~~~

相關文章
相關標籤/搜索