下面是Kotlin中继承的一个例子:
abstract class Animal(val size: Int)
class Dog(val cuteness: Int): Animal(345)
var dog: Dog = Dog(10)
var animal: Animal = dog
var x = 0
...
如果您在最后一行设置断点,变量animal
将被设置为dog
的示例。但是,您只能访问Animal中的size
成员。您无法访问Dog中的cuteness
成员。但Android Studio的调试器仍允许您查看animal
变量中的可爱成员的值。
有没有办法在代码中访问这些隐藏成员?我不认为有。我认为Android Studio知道它们是什么,并将它们显示给您用于调试目的,但由于它们无法通过Kotlin访问,因此它将阻止您在代码中实际访问它们。也许我错了?
4条答案
按热度按时间68bkxrlz1#
我知道这个问题已经得到了回答,但我想补充一些信息。
当你声明animal变量的时候,你会把它的类型设为
Animal
,所以animal不能是别的,如果你给它赋值一个继承自Animal
的类型,比如Dog
,那么Dog
会被强制转换为Animal
,这就是你的例子,所以你只能访问animal成员.但是,您可以使用
as
将Animal
转换回其原始类型Dog
:但是要小心,如果
Animal
不是Dog
,你的程序会崩溃,所以你可以使用as?
的安全转换,它会返回一个可空的Dog?
,如果出错了,它会返回null
,而不是抛出一个异常:vddsk6oq2#
你只需要使用铸造:
将动物(对象)铸造为狗类型,你可以访问可爱的字段,你也可以改变它的值,如果你愿意
我承认这不是最好的解决方案,但效果很好
ogsagwnx3#
你想接近动物的可爱。你必须为此而使用。
ahy6op9u4#
我不确定,但是如果父类型可以访问它的子only特定属性,它会抛出继承提供的所有东西吗?
我能想到的唯一方法是
Animal
有一个开放的属性cuteness
,它可以被其子级继承这样,
Dog
示例或声明为Animal
类型的任何示例都可以按您希望的方式调用cuteness
或者简单地像另一个答案一样,将其转换回
Dog
类型