Java中Downcasting向下转型的用处

看如下代码:

class Animal {
	void makeNoise() {System.out.println("普通叫声"); }
}
class Dog extends Animal {
	void makeNoise() {System.out.println("汪汪汪"); }
	void playDead() { System.out.println("翻滚"); }
}
class Test{
	public static void main(String [] args) {
		Animal [] a = {new Animal(), new Dog(), new Animal() };
		for(Animal animal : a) {
		animal.makeNoise();
		if(animal instanceof Dog) {
			animal.playDead(); //代码段A
		}
	}
}

循环Animal实例时我需要判断当它是狗的时候再调用playDead方法,但是上述代码会包编译错误

The method playDead() is undefined for the type Animal

因为编译的时候都是Animal对象,没有子类Dog中的playDead方法,所以需要进行向下转型Downcast,将代码片段A改为如下代码:

Dog d = (Dog) animal;
d.playDead();

就会正常运行:

普通叫声
汪汪汪
翻滚
普通叫声

 虽然downcast在用于特定的子类是特别有用,但是不能一味的进行downcast:

class Animal { }
class Dog extends Animal { }
class DogTest {
	public static void main(String [] args) {
		Animal animal = new Animal();
		Dog d = (Dog) animal; 
	}
}
该代码能编译但是在运行时会出错:

Exception in thread "main" java.lang.ClassCastException: Animal cannot be cast to Dog
	at DogTest.main(Animal.java:7)


因为Dog继承Animal,所以编译器认为这些Animal对象都有可能是Dog,所以编译不会报错,除非编译器能很明确的知道downcast不行,比如:

Animal animal = new Animal();
String d = (String) animal; 

这段代码在编译时就会报错,因为编译器能很明确知道Animal和String不在同一个继承关系树上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值