在 Kotlin 中獲取物件的例項
獲取物件的例項是我們將在大多數程式語言(如 Kotlin、Java、TypeScript、JavaSript 等)中遇到的常見開發實踐。你可能想要查詢元素例項的情況的一個示例是,當你想要根據元素的型別對元素進行排序時。
在查詢元素的例項時,如果該元素與被匹配的元素具有相同的型別,則結果為真;否則,它返回 false。
在本教程中,我們將學習如何使用 Kotlin 在執行時獲取物件的例項。
在 Kotlin 中使用 is
和泛型獲取物件的例項
泛型是一種用於設計我們的程式碼的開發方法,因此可以使用任何型別重用它。
轉到 IntelliJ 並選擇 File > New Project
建立一個新的 Kotlin 專案。將專案名稱輸入為 kotlinInstancOf
或你喜歡的任何名稱。
在 Language 部分選擇 Kotlin,在 Build System 部分選擇 Intellij。按建立按鈕建立專案。
建立專案後,在 kotlin 資料夾下建立資料夾結構 com/instanceOf
。在 instanceOf
資料夾下建立一個名為 Main.kt
的檔案,並將以下程式碼複製並貼上到該檔案中:
package com.instanceOf
interface Employee{
fun work(): String;
}
class Manager(private val name: String): Employee{
override fun work(): String {
return "$name is preparing the project schedule";
}
}
class Janitor(private val name: String): Employee{
override fun work(): String {
return "$name is cleaning the office";
}
}
fun <T> doWork(Object: T): String {
if (Object is Employee){
return Object.work();
}else{
throw RuntimeException("$Object is not of type Employee")
}
}
fun main() {
println(doWork(Manager("John")));
println(doWork(Janitor("Peter")));
println(doWork("mary"));
}
在這個例子中,我們建立了一個名為 Employee
的介面和兩個名為 Manager
和 Janitor
的具體實現。
doWork()
是上面定義的通用方法,它使用 is
關鍵字來查詢作為引數傳遞的物件是否與 Employee
的型別相同。如果條件返回 true,我們呼叫物件的 work()
方法;否則,我們丟擲一個 RuntimeException()
。
在 main 方法中,我們呼叫 doWork()
方法 3 次,並分別傳遞 Manager
、Janitor
和一個字串作為引數。
該方法的前兩次呼叫被評估為 true,因為它們與 Employee
有關係。但是最後一次呼叫被評估為假,因為字串引數與 Employee
沒有關係。
執行程式碼驗證輸出如下所示。
Exception in thread "main" java.lang.RuntimeException: mary is not of type Employee
John is preparing the project schedule
Peter is cleaning the office
由於 is
關鍵字返回一個布林值,我們可以通過新增字元!
返回 is
關鍵字的反轉。在關鍵字之前字元!
通常發音為 not
,這在使用邏輯閘時很常見。
註釋 doWork()
方法並將其替換為以下程式碼:
fun <T> doWork(Object: T): String{
if (Object !is Employee){
throw RuntimeException("$Object is not of type employee");
}
return Object.work();
}
重新執行程式碼,注意結果和上一個例子的輸出一樣:
John is preparing the project schedule
Peter is cleaning the office
Exception in thread "main" java.lang.RuntimeException: mary is not of type employee
使用 is
和 when
關鍵字在 Kotlin 中獲取物件的例項
when
關鍵字的工作方式與 switch
關鍵字在 Java 中的工作方式相同。唯一的區別是語法。
對前面的示例進行註釋,並將以下程式碼複製並貼上到註釋後的 Main.kt
檔案中。
fun fetchData() = listOf<Any>("book",3,true,"computer");
fun main() {
for (data in fetchData()) {
when(data){
is String -> println(data)
is Int -> println(data)
is Boolean -> println(data)
}
}
}
在上面的示例中,我們建立了一個 fetchData()
方法,通過將其分配給 listOf()
輔助方法來返回 Any
型別的列表。listOf()
方法返回一個包含 String、Int 和 Boolean 型別的列表。
在 main
方法中,我們在執行時通過使用迴圈遍歷列表並將每個值委託給 when()
方法來確定元素型別。在 when()
塊中,傳遞的值的型別使用 is
確定,如果條件評估為真,則將值記錄到控制檯。
你應該注意,如果你在列表中新增另一種型別而沒有在 when()
塊中找到它的型別,則該值不會記錄到控制檯。
執行程式碼,驗證輸出如下圖:
book
3
true
computer
まとめ
在本教程中,我們學習瞭如何利用 Kotlin 程式語言在執行時獲取元素的例項。涵蓋的方法包括:將 is
關鍵字與泛型一起使用,將 is
關鍵字與 when
關鍵字一起使用。
請注意,在使用泛型時,我們必須確保我們使用的是 reified
型別,這意味著型別資訊在執行時可用;否則,型別檢查將不起作用。
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub