8:kotlin 類型檢查和轉換(Type checks and casts)

在運行時可以執行類型檢查以檢查對象的類型。類型轉換將對象強制轉換為不同的類型

is!is

可以使用is或者!is來判斷實例是不是指定的類型

fun main() {var obj : Any = "cast"if (obj is String) {println(obj.length)   // 4}obj = 123if (obj !is String) { print("Not a String") // Not a String} else {println(obj.length)}
}

智能轉換

正常情況下,當使用了is或者!is判斷實例類型時,如果返回的是true則會自動轉成相應的類型,不需要再顯示的進行類型轉換了

fun main() {var obj : Any = "cast"if (obj is String) {println(obj.length)   // 4}
//    println(obj.length)   // 報錯 - Unresolved reference: lengthif (obj !is String) returnprintln(obj.length)
}
fun main() {val x : Any = ""if (x !is String || x.length == 0) returnif (x is String && x.length > 0) {print(x.length) }
}

when中使用

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

注意,只有當編譯器能夠保證變量在檢查和使用之間不會改變時,智能強制轉換才會起作用。

只能轉換在一下場景生效

變量類型說明
var 本地變量一般都會生效,除了局部委托變量
var 類屬性如果屬性是私有的、內部的,或者檢查是在聲明屬性的同一模塊中進行的,那么可以使用智能轉換。但是,智能轉換不能用于開放屬性或具有自定義 getter 的屬性。
val本地變量如果變量在檢查和使用之間沒有被修改,沒有被修改它的 lambda 捕獲,也不是本地委托屬性,那么就可以使用這個變量。
val類屬性永遠不會,因為變量可以在任何時候被其他代碼修改。

不安全的強制轉換

不安全的強制轉換通常會報錯,使用as進行操作

fun main() {val str: Any = "cast"val s = str as Stringval i = str as Int  //報錯 java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer
}

注意,不能使null轉換成String類型,如果有null風險,需要添加?

fun main() {val str: Any? = nullval s1 = str as String?val s2 = str as String   // 報錯 - java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
}

安全的強制轉換

如果要避免異常,可以使用as?,如果轉換失敗則返回null

fun main() {val str: Any? = nullval s = str as? Stringprintln(s)  // null
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態規劃 之 鋼條切割

自頂向下遞歸實現(Recursive top-down implementation) 程序CUT-ROD對等式(14.2)進行了實現,偽代碼如下: CUT-ROD(p, n)if n 0return 0q -∞for i 1 to nq max{q, p[i] CUT-ROD(p, n - i)}return q上面解決中重復對一個子結構問題重復求解了&#…

Qt無邊框窗口設置陰影

//設置窗體透明this->setAttribute(Qt::WA_TranslucentBackground, true);//設置無邊框this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);QVBoxLayout* pMainLay new QVBoxLayout(this);CLoginRealWidget* pRealWidget new …

VR全景展示,“超前點播”打開娛樂行業線上營銷門戶

如今,人們的生活水平正在逐步提高,這種提高不僅僅是體現在衣食住行上,更多方面是體現在大眾的娛樂活動上。我們可以看到,相比于過去娛樂種類的匱乏,現如今,各種娛樂活動可謂是百家爭鳴,例如溫泉…

目標檢測YOLO實戰應用案例100講-基于多光譜圖像融合的光伏組件故障 檢測

目錄 前言 國內外研究現狀 多光譜圖像配準研究現狀 光伏區域識別研究現狀

java學習part10 this

90-面向對象(進階)-關鍵字this調用屬性、方法、構造器_嗶哩嗶哩_bilibili 1.java的this java的this性質類似cpp的this, 但它是一種引用,所以用 this. xxx來調用。 this代表當前的類的實例,所以必須和某個對象結合起來使用,不能…

webrtc的RTCPeerConnection使用

背景: 平時我們很少會需要使用到點對點單獨的通訊,即p2p,一般都是點對服務端通訊,但p2p也有自己的好處,即通訊不經過服務端,從服務端角度這個省了帶寬和壓力,從客戶端角度,通訊是安全&#xff…

Javaweb之前端工程化的詳細解析

3 前端工程化 3.1 前端工程化介紹 我們目前的前端開發中,當我們需要使用一些資源時,例如:vue.js,和axios.js文件,都是直接再工程中導入的,如下圖所示: 但是上述開發模式存在如下問題&#xff…

git的使用:本地git下載、sshkey的添加、github倉庫創建及文件上傳

一、github創建賬號 即github注冊賬號,登錄github官網,根據提示注冊即可 github官網 二、git客戶端下載安裝 已有很多git下載安裝的博文了,在此就不贅述 三、sshkey的生成與添加 1、sshkey的生成以及查看 // sshkey的生成命令&#xff…

OSS+CDN的資費和安全

文章目錄 花費OSSCDNOSS CDN 安全OSS防盜鏈跨域設置CORS數據加密 CDN防盜鏈URL鑒權Cookie鑒權遠程鑒權IP黑白名單UA黑白名單 回源服務自定義私有參數IP黑白名單數據加密 花費 OSS 存儲費用 :0.12元/GB/月下行流量費用 :0.5元/GB請求費用 :…

java全局異常處理(springboot)

介紹: 在日常項目開發中,異常是常見的,但是如何更高效的處理好異常信息,讓我們能快速定位到BUG,是很重要的,不僅能夠提高我們的開發效率,還能讓你代碼看上去更舒服,SpringBoot的項目…

C語言你愛我么?(ZZULIOJ 1205:你愛我么?)

題目描述 LCY買個n束花準備送給她暗戀的女生,但是他不知道這個女生是否喜歡他。這時候一個算命先生告訴他讓他查花瓣數,第一個花瓣表示"愛",第二個花瓣表示"不愛",第三個花瓣表示"愛"..... 為了使最…

某60區塊鏈安全之未初始化的存儲指針實戰二學習記錄

系列文章目錄 文章目錄 系列文章目錄未初始化的存儲指針實戰二實驗目的實驗環境實驗工具實驗原理實驗內容實驗過程EXP利用 未初始化的存儲指針實戰二 實驗目的 學會使用python3的web3模塊 學會分析以太坊智能合約未初始化的存儲指針漏洞 找到合約漏洞進行分析并形成利用 實驗…

機器學習之自監督學習(四)MoCo系列翻譯與總結(二)

MoCo中相關工作的對比分析 去噪自動編碼器(Denoising Autoencoder)是一種用于學習數據表示的神經網絡模型。它的主要目標是通過去除輸入數據中的噪聲,學習到輸入數據的有用表示,從而提高模型對干凈數據的魯棒性。下面是對去噪自動…

Flink 常用物理分區算子(Physical Partitioning)

Flink 物理分區算子(Physical Partitioning) 在Flink中,常見的物理分區策略有:隨機分配(Random)、輪詢分配(Round-Robin)、重縮放(Rescale)和廣播(Broadcast)。 接下來,我們通過源碼和Demo分別了解每種物理分區算子的作用和區別。 (1) 隨機…

win10安裝pytorch(py39)

cuda≤11.6,觀察控制面板 觀察torch對應cuda版本 https://download.pytorch.org/whl/torch/ 安裝cuda11.6.0 CUDA Toolkit Archive | NVIDIA Developer cmd輸入nvcc -V 編輯國內鏡像源 .condarc anaconda prompt輸入 查看環境 conda env list 安裝py3.9…

uniapp視頻倍速播放插件,uniapp視頻試看插件——sunny-video使用文檔

sunny-video視頻倍速播放器 組件名:sunny-video 效果圖 img1img2img3img4 平臺差異說明 目前已應用到APP(安卓、iOS)、微信(小程序、H5)其它平臺未測試 安裝方式 本組件符合easycom規范,HBuilderX 2.5…

emoji

圖標的網址: webfx emojipedia 1.可以直接復制粘貼 2.按照其格式文本表示(Shortcodes) 🚀 😄 🤫 ?? 💀 還有關于通過鏈接引用shield.io中的圖標,沒有深究,不…

第六十三周周報

學習目標: 項目 實驗和論文 學習時間: 2023.11.18-2023.11.24 學習產出: 論文 對論文進行了潤色和修改 實驗 1、上周DiffusionRelative的結果無法再次復現,新跑的FID與以前實驗跑的結果相差不大,上周的結果應…

點大商城V2.5.3分包小程序端+小程序上傳提示限制分包制作教程

這幾天很多播播資源會員反饋點大商城V2.5.3小程序端上傳時提示大小超限,官方默認單個包都不能超過2M,總分包不能超20M。如下圖提示超了93KB,如果出現超的不多情況下可采用手動刪除一些images目錄下不使用的圖片,只要刪除超過100KB…

鴻蒙4.0開發筆記之DevEco Studio如何使用低代碼開發模板進行開發的詳細流程(六)

鴻蒙低代碼開發 一、什么是低代碼二、如何進行鴻蒙低代碼開發1、 創建低代碼開發工程(方式壹)2、已有工程則創建Visual文件(方拾貳) 三、低代碼開發界面介紹四、低代碼實現頁面跳轉五、低代碼開發建議 一、什么是低代碼 所謂低代碼…