最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin類型系統(tǒng)竟如此簡(jiǎn)單

 更新時(shí)間:2019年09月07日 08:49:30   作者:DROID  
這篇文章主要給大家介紹了關(guān)于Kotlin類型系統(tǒng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Quote

在學(xué)習(xí) Kotlin 的過(guò)程中,對(duì) Kotlin 的類型系統(tǒng)產(chǎn)生了好奇,Kotlin 是否存在類似于 Java 中 Object 的公共基類?Kotlin 中是否也有類似于 Java 基礎(chǔ)類型這樣的單獨(dú)分支?在研究一番過(guò)后,博主發(fā)現(xiàn)相較于 Java,Kotlin 交出了更為滿意的答案,而且出乎意外地簡(jiǎn)單,只需要遵循簡(jiǎn)單的規(guī)則,便能理解整個(gè)類型系統(tǒng)。

Any

Any 等同于 Java 中的 Object 的概念,Any 在注釋中這么寫(xiě)到:

The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.

我們來(lái)簡(jiǎn)單驗(yàn)證下 Any 是一切的基類。

class Fruit
fun main(args: Array<String>) {
println(Fruit() is Any)
}

在上面的代碼中,我們新建了一個(gè)類,然后構(gòu)造它的實(shí)例,看它是否為 Any,答案顯而易見(jiàn)地為 true。

我們?cè)诳匆恍?kotlin 中的基礎(chǔ)類型,也就是 Int、Double、Float、Byte 等等的父類是否也是 Any。

println(3.233F is Any)
println(2 is Any)

答案也是true。這里額外地解釋下,Kotlin 并沒(méi)有 Java 中基礎(chǔ)類型和封裝類型差異化處理,也沒(méi)有拆箱和裝箱的處理?;A(chǔ)類型就是基礎(chǔ)類型,但它們也以Any作為父類。

Unit

再來(lái)看看 Unit 這個(gè) Kotlin 中的特殊東西。

/**
* The type with only one value: the `Unit` object. 
* This type corresponds to the `void` type in Java.
*/
public object Unit {
override fun toString() = "kotlin.Unit"
}

在 kotlin 中每個(gè)函數(shù)一定是有返回值的。

這里說(shuō)明一下概念,也將會(huì)在后續(xù)的章節(jié)里面再次提到。kotlin 為了這個(gè)一定有返回值這個(gè)概念,做了很多工作,但好處是非常明顯的,我們能夠以統(tǒng)一的視角來(lái)看待 kotlin 的函數(shù)。

Unit 這個(gè)概念表征著什么都不做,但什么都不做確實(shí)也是一種返回值。如果我們不做任何聲明,函數(shù)的返回值就是 Unit,表明我返回了一個(gè)什么都沒(méi)做的東西。

我們來(lái)驗(yàn)證一下,聲明一個(gè)空函數(shù),然后打印它。(在 Java 中會(huì)編譯不過(guò))

fun justReturn() {
}

fun main(args: Array<String>) {
print(justReturn())
}

結(jié)果輸出了kotlin.Unit,證明了返回值就是 Unit。

那么這里有一個(gè)疑問(wèn),就是 Unit 和 Any 什么關(guān)系?我們通過(guò) is 關(guān)鍵字來(lái)看看。

fun main(args: Array<String>) {
print(justReturn() is Any)
}

恩恩,Unit 也是 Any 的子類!

Nothing

我們繼續(xù)延展下kotlin 中每個(gè)函數(shù)一定是有返回值的這個(gè)概念。前面我們看的是正常返回的情況,那如果程序發(fā)生異常,也會(huì)有返回值嗎?kotlin 對(duì)于這種情況,也是延續(xù)了一定有返回值這種概念。這個(gè)返回值叫做 - Nothing!

Nothing 意味著不可達(dá),程序?qū)嶋H運(yùn)行時(shí)不會(huì)產(chǎn)生任何一個(gè) Nothing 類型對(duì)象,啥?!這怎么理解。kotlin 一旦發(fā)現(xiàn)返回了 Nothing,會(huì)保證后面的代碼不再執(zhí)行。

所以 Nothing 常用于 throw 這樣異常退出的情況,這樣后續(xù)的代碼就不會(huì)被執(zhí)行。我們看看 kotlin 中自身的例子。

/**
* Terminates the currently running process.
*
* @param status serves as a status code; by convention,
* a nonzero status code indicates abnormal termination.
*
* @return This method never returns normally.
*/
@kotlin.internal.InlineOnly
public inline fun exitProcess(status: Int): Nothing {
System.exit(status)
throw RuntimeException("System.exit returned normally, while it was supposed to halt JVM.")
}

注意啦,我們?cè)倏纯?Nothing 在類型系統(tǒng)中的位置。Nothing 與 Any 相反,是一切類型的子類!也就是說(shuō) Nothing,是 Fruit、是 School、是 Money、也是 Any。Nothing 意味著不可達(dá)的狀態(tài),每一種類型都包含這種不可達(dá)的狀態(tài),因而這種狀態(tài) Nothing,是這些的子類。

注意上圖中 Nothing 所處的位置。

Nullable

kotlin 的一大殺手锏就是這個(gè)可空類型,一種類型后面加上?,這種類型就可以為空了。我們來(lái)看看引入可空類型過(guò)后,類型系統(tǒng)是怎樣的。

1、首先看看普通類和可空類型之間的關(guān)系。

class Fruit
fun main(args: Array<String>) {
print(Fruit() is Fruit?)
}

答案是true,這里很好理解,兩者之間的區(qū)別在于是否可以為空,可以為空的自然而然是基類,不可為空的是可以為空下的一種派生。

2、Any 是否有可空類型

kotlin 最讓人欣賞的地方在于一個(gè)概念貫徹到底。Any 在 kotlin 中也是有可空類型的。感官上 Any? 是 Any 的父類,Any 是不可空類型的父類,所以 Any? 也是不可空類型的父類嗎?答案就是這樣的,我們來(lái)驗(yàn)證下。

class Fruit
fun main(args: Array<String>) {
print(Fruit() is Any?)
}

3、Unit 是否有可空類型

是的,Unit 也有空類型 Unit?。但這是一個(gè)難理解的概念,其本身包含了兩個(gè)值 Unit 和 null。這是 kotlin 為了延續(xù)統(tǒng)一的概念,很少會(huì)有場(chǎng)景使用到,但咱們得清楚。

4、Nothing 是否有可空類型

Nothing 當(dāng)然也有可空類型 Nothing?,其本身有且僅有一個(gè)值 null,也就是說(shuō)其就是 null。Nothing 本身不可達(dá),不會(huì)有任何一個(gè)實(shí)例,那就只能是 null 了。

我們來(lái)驗(yàn)證一下

fun main(args: Array<String>) {
println(null is Nothing)
println(null is Nothing?)
println(null is Any)
println(null is Any?)
}

分別是 false、true、false 和 true。

總結(jié)

這里借用下 natpryce 的圖,大家看一下這張圖,這就是 kotlin 的類型系統(tǒng)。

咱們只需要理解一下幾點(diǎn),就完全弄明白 kotlin 類型系統(tǒng)。

  • Any 和 Nothing 分別是所有對(duì)象的基類和子類。
  • 可空類型是不可空類型的父類。

當(dāng)我們不清楚類型時(shí),對(duì)照上面兩個(gè)概念就能明白。

參考

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android 進(jìn)度條使用詳解及示例代碼

    Android 進(jìn)度條使用詳解及示例代碼

    本文主要介紹Android 進(jìn)度條的知識(shí),這里整理了相關(guān)資料及實(shí)現(xiàn)示例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • Kotlin startActivity跳轉(zhuǎn)Activity實(shí)現(xiàn)流程詳解

    Kotlin startActivity跳轉(zhuǎn)Activity實(shí)現(xiàn)流程詳解

    在Android當(dāng)中,Activity的跳轉(zhuǎn)有兩種方法,第一個(gè)是利用startActivity(Intent intent);的方法,第二個(gè)則是利用startActivityForResult(Intent intent,int requestCode);的方法,從字面上來(lái)看,這兩者之間的差別只在于是否有返回值的區(qū)別,實(shí)際上也確實(shí)只有這兩種區(qū)別
    2022-12-12
  • EditText限制輸入數(shù)字,精確到小數(shù)點(diǎn)后1位的設(shè)置方法

    EditText限制輸入數(shù)字,精確到小數(shù)點(diǎn)后1位的設(shè)置方法

    下面小編就為大家?guī)?lái)一篇EditText限制輸入數(shù)字,精確到小數(shù)點(diǎn)后1位的設(shè)置方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Android ViewPager的MVP架構(gòu)搭建過(guò)程

    Android ViewPager的MVP架構(gòu)搭建過(guò)程

    本文主要介紹了ViewPager在Android中的作用以及使用場(chǎng)景,如引導(dǎo)頁(yè)、圖片瀏覽器、新聞或文章內(nèi)容的多標(biāo)簽頁(yè)等,同時(shí),還詳細(xì)闡述了如何通過(guò)MVP架構(gòu)來(lái)搭建ViewPager,將視圖和邏輯進(jìn)行解耦,提高代碼的可測(cè)試性、可復(fù)用性,使代碼結(jié)構(gòu)更清晰且易于擴(kuò)展功能
    2024-10-10
  • android FragmentTabhost實(shí)現(xiàn)導(dǎo)航分頁(yè)

    android FragmentTabhost實(shí)現(xiàn)導(dǎo)航分頁(yè)

    這篇文章主要為大家詳細(xì)介紹了android FragmentTabhost實(shí)現(xiàn)導(dǎo)航分頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android PopupWindow實(shí)現(xiàn)遮罩層效果

    Android PopupWindow實(shí)現(xiàn)遮罩層效果

    這篇文章主要為大家詳細(xì)介紹了Android PopupWindow實(shí)現(xiàn)遮罩層效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android中實(shí)現(xiàn)監(jiān)聽(tīng)ScrollView滑動(dòng)事件

    Android中實(shí)現(xiàn)監(jiān)聽(tīng)ScrollView滑動(dòng)事件

    這篇文章主要介紹了Android中實(shí)現(xiàn)監(jiān)聽(tīng)ScrollView滑動(dòng)事件,本文用重寫(xiě)ScrollView類的方法實(shí)現(xiàn)了一些擴(kuò)展功能,需要的朋友可以參考下
    2015-05-05
  • Android中通過(guò)RxJava進(jìn)行響應(yīng)式程序設(shè)計(jì)的入門指南

    Android中通過(guò)RxJava進(jìn)行響應(yīng)式程序設(shè)計(jì)的入門指南

    響應(yīng)式編程在Android中的運(yùn)用是非常犀利的,比如在異常處理和調(diào)度器方面,這里我們將從生命周期等方面來(lái)講解Android中通過(guò)RxJava進(jìn)行響應(yīng)式程序設(shè)計(jì)的入門指南:
    2016-06-06
  • Android 菜單欄DIY實(shí)現(xiàn)效果詳解

    Android 菜單欄DIY實(shí)現(xiàn)效果詳解

    這篇文章主要為大家介紹了Android 菜單欄DIY實(shí)現(xiàn)效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Android入門之Activity四種啟動(dòng)模式(standard、singleTop、singleTask、singleInstance)

    Android入門之Activity四種啟動(dòng)模式(standard、singleTop、singleTask、singl

    當(dāng)應(yīng)用運(yùn)行起來(lái)后就會(huì)開(kāi)啟一條線程,線程中會(huì)運(yùn)行一個(gè)任務(wù)棧,當(dāng)Activity實(shí)例創(chuàng)建后就會(huì)放入任務(wù)棧中。Activity啟動(dòng)模式的設(shè)置在AndroidManifest.xml文件中,通過(guò)配置Activity的屬性android:launchMode=""設(shè)置
    2015-12-12

最新評(píng)論

房产| 聂荣县| 沿河| 武隆县| 苍南县| 酒泉市| 米林县| 三明市| 乐山市| 娱乐| 双辽市| 罗田县| 兴安盟| 泰安市| 崇信县| 奎屯市| 嘉黎县| 共和县| 溧阳市| 滕州市| 泰安市| 五莲县| 淄博市| 灵璧县| 庆元县| 嘉定区| 五大连池市| 长治市| 江华| 东乌珠穆沁旗| 厦门市| 长春市| 永吉县| 德令哈市| 四川省| 福安市| 霸州市| 曲松县| 丹江口市| 剑川县| 辉南县|