1. 程式人生 > >Kotlin 其他(四) --- 型別的檢查與轉換“is”與“as”

Kotlin 其他(四) --- 型別的檢查與轉換“is”與“as”

1、is 與 !is 操作符

我們可以在執行時通過使用 is 操作符或其否定形式 !is 來檢查物件是否符合給定型別:

if (obj is String) {
    print(obj.length)
}

if (obj !is String) { // 與 !(obj is String) 相同
    print("Not a String")
}
else {
    print(obj.length)
}

2、智慧轉換

在許多情況下,不需要在 Kotlin 中使用顯式轉換操作符,因為編譯器跟蹤不可變值的 is-檢查以及顯式轉換,並在需要時自動插入(安全的)轉換:

fun demo(x: Any) {
    if
(x is String) { print(x.length) // x 自動轉換為字串 } }

編譯器足夠聰明,能夠知道如果反向檢查導致返回那麼該轉換是安全的:

  if (x !is String) return
    print(x.length) // x 自動轉換為字串

或者在 && 和 || 的右側:

 // `||` 右側的 x 自動轉換為字串
    if (x !is String || x.length == 0) return

    // `&&` 右側的 x 自動轉換為字串
    if (x is String && x.length
> 0) { print(x.length) // x 自動轉換為字串 }

這些 智慧轉換 用於 when-表示式 和 while-迴圈 也一樣:

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

請注意,當編譯器不能保證變數在檢查和使用之間不可改變時,智慧轉換不能用。 更具體地,智慧轉換能否適用根據以下規則:

  • val 區域性變數——總是可以;
  • val 屬性——如果屬性是 private 或 internal,或者該檢查在宣告屬性的同一模組中執行。智慧轉換不適用於 open的屬性或者具有自定義 getter 的屬性;
  • var 區域性變數——如果變數在檢查和使用之間沒有修改、並且沒有在會修改它的 lambda 中捕獲;
  • var 屬性——決不可能(因為該變數可以隨時被其他程式碼修改)。

3、“不安全的”轉換操作符

通常,如果轉換是不可能的,轉換操作符會丟擲一個異常。因此,我們稱之為不安全的。 Kotlin 中的不安全轉換由中綴操作符 as(參見operator precedence)完成:

val x: String = y as String

請注意,null 不能轉換為 String 因該型別不是可空的, 即如果 y 為空,上面的程式碼會丟擲一個異常。 為了匹配 Java 轉換語義,我們必須在轉換右邊有可空型別,就像:

val x: String? = y as String?

4、“安全的”(可空)轉換操作符

為了避免丟擲異常,可以使用安全轉換操作符 as?,它可以在失敗時返回 null:

val x: String? = y as? String

請注意,儘管事實上 as? 的右邊是一個非空型別的 String,但是其轉換的結果是可空的。

相關推薦

Kotlin 其他 --- 型別檢查轉換isas

1、is 與 !is 操作符 我們可以在執行時通過使用 is 操作符或其否定形式 !is 來檢查物件是否符合給定型別: if (obj is String) { print(obj.length) } if (obj !is String) {

Kotlin基礎Lambda編程

構造 引用 元素 允許 其他 create text 顯示 tag Lambda編程 一、Lambda表達式和成員引用 一)Lambda表達式語法 1 //註意與Java8中的區別 2 val sum={ x:Int,y:Int -> x+y } 3

其他 -- 流程控制結構

lse In 控制 分支 控制結構 循環 判斷 添加 end 流程控制結構 說明: 順序結構:程序從上往下依次執行 分支結構:程序按條件進行選擇執行,從兩條或多條路徑中選擇一條執行 循環結構:程序滿足一定條件下,重復執行一組語句 分支結構 特點: 1、if 函數功能:實

spring 官方文件的介面理解整理型別轉換spring例項解析

上篇文章解析了spring型別轉換的介面和他們的分工,怎麼通過設計模式實現轉換功能。 這篇需要些上篇的知識,如果沒有看可以從這兒跳轉spring 官方文件的介面理解整理(三)型別轉換 一、準備新建Maven專案,pom.xml內容如下 <properties>

OpenCV學習筆記30KAZE 演算法原理原始碼分析KAZE特徵的效能分析比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

面試--集合併發集合框架阻塞佇列非阻塞佇列

java語的框架父類介面是Iterable,從這個介面向下一一進行繼承。 一:集合架構的簡介 1:介面Iterable 主要用於迭代迴圈,僅有一個iterator()方法,通過返回Iterable物件,進行迴圈處理。 2:介面Collection 提供了集合框架最主要,最常用的操

Kubernetes使用者指南--應用檢查和除錯

一、除錯 當你的應用開始執行,那麼DEBUG是不可避免的問題。 早些時候,我們在描述的是如何通過kubectl get pods來獲得Pod的簡單狀態資訊。 但是現在,這裡有更多的方式來獲得關於你的應用的更多資訊。 1、使用kubectl describe pod來獲得

詳解SVM系列:線性支援向量機軟間隔最大化

線性支援向量機 線性可分問題的支援向量機學習方法,對線性不可分訓練資料是不適用的,因為這時上述方法的不等式約束並不能都成立。 舉2個例子: 如果沒有混入異常點,導致不能線性可分,則資料可以按上面的實線來做超平面分離的。 這種情況雖然不是不可分的,但是由於其中的一個藍色點不滿足線性

演算法快學筆記:快速排序的原理實現

1. 原理介紹 快速排序是一種排序演算法,速度比選擇排序快得多,其主要基於“分而治之”的思想對集合進行排序,本文將對該演算法進行分析。 2. 分而治之(D&C)的思想 D&C主要指利用遞迴的方式來不斷的縮小需要處理問題的規模,最終使問題容易解決。使用D&C

Android Multimedia實戰MediaProjection實現截圖,MediaMuxer實現錄屏為MP4,Gif格式

MediaProjection可以用來捕捉螢幕,具體來說可以擷取當前螢幕和錄製螢幕視訊 (5.0以上) 先總結下系統是如何實現組合鍵截圖的: 都應該知道Android原始碼中對按鍵的捕獲位於檔案PhoneWindowManager.java中 當滿足按鍵

目標檢測的影象特徵提取之OpenCV中BLOB特徵提取幾何形狀分類

OpenCV中BLOB特徵提取與幾何形狀分類一:方法二值影象幾何形狀提取與分離,是機器視覺中重點之一,在CT影象分析與機器人視覺感知等領域應用廣泛,OpenCV中提供了一個對二值影象幾何特徵描述與分析最有效的工具 - SimpleBlobDetector類,使用它可以實現對二

Java入門:運算子優先順序、關鍵字保留字

上次介紹了Java的運算子,今天來介紹下運算子的優先順序,以及Java的關鍵字、保留字。 一、運算子優先順序 序號 運算子 名稱 目數 結合性 說明 1 [ ]

Kotlin筆記——類和類的構造器

從這篇文章開始,我們進入Kotlin面向物件程式設計的世界,這部分的內容相對較多,也是十分重要的,我儘可能將我所學到的介紹給大家。 可見性修飾符 在開始介紹類之前,先來簡單說明一下Kotlin的可見

Android學習筆記--RecyclerView擴充套件下拉重新整理左滑刪除

今天在使用QQ的時候就想到製作一個訊息列表的類似效果,可以實現下拉重新整理和左滑刪除效果,於是就抽空試了試。先上效果圖。 這是正在重新整理的時候。然後就會增添一個item(那個重新整理的圈是會轉的然後還可以變顏色我不會截動圖)。見下圖。 Recycl

Spring Cloud實戰之初級入門— 利用Hystrix實現服務熔斷服務監控

close 哪些 cati status netflix turn 遠程倉庫 monitor mri 目錄 1.環境介紹 2.服務監控 2.1 加入依賴 2.2 修改配置文件 2.3 修改啟動文件 2.4 監控服務 2.5 小結 3. 利用hystrix實現消費服務熔斷

C++ 高階篇—— 型別轉換高階

目前為止,我們一直使用傳統的型別轉換符來進行簡單物件的型別轉換。例如,要把一個double型別的浮點型數字轉換為int 的整型數字,我們是這樣做的: int i; double d; i = (int) d; 或者 i = int (d); 這樣做對基本資料型別時沒問題的,

Kotlin 其他 --- 操作符過載Operator overloading

1、操作符過載 Kotlin 允許我們為自己的型別提供預定義的一組操作符的實現。這些操作符具有固定的符號表示 (如 + 或 *)和固定的優先順序。為實現這樣的操作符,我們為相應的型別(即二元操作符左側的型別和一元操作符的引數型別)提供了一個固定名字的 成員函式

SODBASE CEP學習:類SQL語言EPLStorm或jStorm整合

Storm框架原本是設計用來做網際網路短文字處理和一些統計工作的,是一種分散式流式計算框架。在一些場合,特別是在已經用了Storm架構以後,發現又想用EPL語句,Storm和類SQL語言EPL結合也不失為一種方案。對線上規則修改、視窗資料可靠性要求高的地方還有用專用的CE

Kotlin 其他 --- 空安全Null Safety

1、可空型別與非空型別 Kotlin 的型別系統旨在消除來自程式碼空引用的危險,也稱為《十億美元的錯誤》。 許多程式語言(包括 Java)中最常見的陷阱之一是訪問空引用的成員,導致空引用異常。 在 Java 中, 這等同於 NullPointerExcep

bluetooth開發------Bluez執行環境的建立藍芽的初始化

bluez已經移植完成,下一步就是如何建立bluez執行的系統環境。 其實整個過程分為兩個部分: 1、準備dbus 和bluetoothd 所需要的庫檔案,一般這些庫都屬於公共庫,名字就不列舉了,一般執行不成功就是缺少這些庫,這部分自己解決吧。 2、晒一晒我的初始化指