繁体   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