簡體   English   中英

How to cast super class object to sub class object in Kotlin?

[英]How to cast super class object to sub class object in Kotlin?

在這里,我試圖將超類 object 轉換為子類。 我收到運行時錯誤,因為“無法轉換類”。

例如:

class Animal {}
class Cat : Animal() {}

class abc {
fun abcd(): Animal {
    return Animal()
}

fun getData() {
    val cat: Cat = abcd() as Cat     //Giving me runtime error.
}
}

在這里,我試圖將超類對象轉換為子類。 我收到運行時錯誤,因為“無法轉換類”。

例如:

class Animal {}
class Cat : Animal() {}

class abc {
fun abcd(): Animal {
    return Animal()
}

fun getData() {
    val cat: Cat = abcd() as Cat     //Giving me runtime error.
}
}

在這里,我試圖將超類對象轉換為子類。 我收到運行時錯誤,因為“無法轉換類”。

例如:

class Animal {}
class Cat : Animal() {}

class abc {
fun abcd(): Animal {
    return Animal()
}

fun getData() {
    val cat: Cat = abcd() as Cat     //Giving me runtime error.
}
}

我知道這是一個老問題,但它是谷歌搜索“Kotlin 如何將超類轉換為子類”的第一個熱門搜索,所以為了繁榮:

如何在 Kotlin 中轉換為子類
使用原始問題中的“as”關鍵字:

if(animal is Cat) {
    Cat cat = animal as Cat
}

原始問題簡短回答,您不能將超類object轉換為子類object 轉換僅更改object 的引用類型,object 本身保持不變。

問題中的 Animal class 幾乎肯定應該被標記為抽象的。 這樣就不可能意外實例化非特定動物,這就是問題中發生的情況並導致異常。

如果它引用的 object 是 Cat,Animal引用變量絕對可以轉換為 Cat。 但是在這個問題中,一個非特定的 Animal 被實例化,然后嘗試轉換為 Cat,但由於它沒有引用 Cat object,這可以理解地引發異常。

所以不像,比如說,將一個 Int 轉換為一個 Double,其中該轉換似乎改變了 object 引用的類型,而轉換似乎改變了 object 引用實際上並沒有“改變” object,只是你的引用有多精細。
施法不能將狗變成貓,它只能將您從將動物視為普通動物,查看所有動物的通用屬性,變為將其視為貓或狗,並且只能訪問貓或狗的屬性有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM