如果我遇到以下情况,我定义了一个类Animal和另一个类Dog,用以下两行代码扩展Animal:
1( Dog d=(Dog(new Animal((//显式下变频
2( 动物a=新狗狗((//自动上行
以这种方式定义两种动物的利弊是什么?具体来说,在什么情况下,我更喜欢(1(而不是(2(,反之亦然?
据我所知,我们很沮丧能够使用Dog的方法,但为什么不把它称为狗呢?
提前感谢!
听起来您有兴趣了解更多关于上行和下行的信息,在这种情况下,您可能会发现这个答案很有帮助。
为了扩展你的问题并从链接的答案中提取,上行广播总是允许的,但下行广播涉及类型检查,它可以抛出ClassCastException
。
尽管如此,在执行强制转换之前,您可以使用instanceof运算符来检查对象的运行时类型,这样可以防止出现以下代码中的异常。
你可能选择向下转换的一个原因是,你希望一种方法适用于所有动物,但让它做一些特别针对狗的事情,这可能会导致这样的代码:
public void pet(Animal animal) {
// Do something else if animal is a Dog
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.growl();
}
}