在 Kotlin 中獲取物件的例項

David Mbochi Njonge 2023年1月30日
  1. 在 Kotlin 中使用 is 和泛型獲取物件的例項
  2. 使用 iswhen 關鍵字在 Kotlin 中獲取物件的例項
  3. まとめ
在 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 的介面和兩個名為 ManagerJanitor 的具體實現。

doWork() 是上面定義的通用方法,它使用 is 關鍵字來查詢作為引數傳遞的物件是否與 Employee 的型別相同。如果條件返回 true,我們呼叫物件的 work() 方法;否則,我們丟擲一個 RuntimeException()

在 main 方法中,我們呼叫 doWork() 方法 3 次,並分別傳遞 ManagerJanitor 和一個字串作為引數。

該方法的前兩次呼叫被評估為 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

使用 iswhen 關鍵字在 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 Mbochi Njonge avatar David Mbochi Njonge avatar

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