日期:2014-05-20  浏览次数:20669 次

Java编译器为什么会允许2个不相关的接口之间进行强制转换
看看下面的代码,我成功的骗过了编译器,到运行时才出错:
class Demo {
public static void main(String[] args) {
Eatable e = new Apple();
Wearable w = (Wearable)e;

w.wear();
}
}

class Apple implements Eatable {
public void eat() {

}
}

interface Eatable {
public void eat();
}

interface Wearable {
public void wear();
}


这种错误编译器应该是能检查出来的吧?

------解决方案--------------------
这种编译器根本无法检查。



你这里class Apple implements Eatable,Wearable
如果Apple同时实现两个接口呢,就不会出现错误了,但是编译器是无法判断的,因为编译器并不知道你e这个引用在运行期指向的实际对象究竟是什么类型,只知道是一个实现了Eatable接口的对象。
但是就算Apple同时实现了这两个接口,但是实际上这两个接口之间还是没有任何关系的。
------解决方案--------------------
你要知道java的异常机制就知道为什么了,一个是编译期,一个是运行期。