Kotlin並不區分 基本數據類型和包裝類型,永遠使用同一個類型。java
大多數狀況下——對於變量、屬性、參數和返回類型——Kotlin的Int類型會被編譯成Java基本數據類型int。惟一不可行的例外是泛型類,如集合。markdown
Kotlin中的可空類型 不能用Java的基本數據類型表示,由於***null
只能被存儲在Java的引用類型***的變量中。這就意味着任什麼時候候只要使用了基本數據類型的可空版本,它就會編譯成對應的包裝類型。ide
Kotlin和Java之間一條重要的區別就是處理數字轉換的方式。函數
Kotlin不會自動地把數字從一種類型轉換成另一種,即使是轉換成範圍更大的類型。ui
爲避免意外狀況,Kotlin要求轉換必須是顯式的,尤爲是在比較裝箱值的時候。spa
和Object做爲Java類層級結構的根差很少,Any
*類型是Kotlin全部非空類型的超類型*(非空類型的根)。code
注意***Any
是非空類型,因此Any
類型的變量不能夠持有null值。在Kotlin中若是你須要能夠持有任何可能值的變量,包括null在內,必須使用Any?
***類型。orm
在底層,Any
類型對應java.lang.Object
。Kotlin把Java方法參數和返回類型中用到的Object類型看做***Any
***.string
Kotlin中的***Unit
類型完成了Java中的void
***同樣的功能。當函數沒什麼有意思的結果要返回時,它能夠用做函數的返回類型:it
fun f(): Unit { ... }
複製代碼
語法上,這和寫一個帶有代碼塊體但不帶類型聲明的函數沒有什麼不一樣:
// 顯式的Unit聲明被省略了
fun f(): { ... }
複製代碼
Kotlin和Unit和Java的void到底有什麼不同呢?Unit
是一個完備的類型,能夠做爲類型參數**,而void卻不行。只存在一個值是***Unit
類型,這個值也叫做Unit
,而且(在函數中)會被隱式返回**。在重寫返回泛型參數的函數時這很是有用,只須要讓方法返回**Unit
***類型的值:
interface Processor<T> {
fun process(): T
}
class NoResultProcessor: Processor<Unit> {
// 返回Unit,但能夠省略類型說明
override fun process() {
// do stuff
// 這裏不須要顯式的return
}
}
複製代碼
*Nothing
*類型沒有任何值,只有被看成函數返回值使用,或者被看成泛型函數返回值的類型參數使用纔會有意義。在其餘狀況下,聲明一個不能存儲任何的變量沒有任何意義。
fun fail(message: String): Nothing {
throw IllegalStateException(message)
>>> fail("Error occurred")
java.lang.IllegalStateException: Error occurred
複製代碼
注意:返回***
Nothing
的函數能夠放在Elvis
***運算符的右邊作先決條件檢查。