java - 重写有异常编译器错误的方法

标签 java inheritance compiler-errors polymorphism subtype

“a.eat()”下面的代码会导致编译错误,需要声明或捕获该错误。

class Animal {
   public void eat() throws Exception {}
}

class Dog extends Animal {
 public void eat() {}

 public static void main(String [] args) {
   Animal a = new Dog();
   Dog d = new Dog();
   d.eat(); 
   a.eat();//Causes compilation error as 'a' was not declared or caught
   }
}             

为什么编译器仍然认为您正在调用声明异常的方法?为什么编译器看不到该方法已被子类型覆盖,如“d.eat()”中所示?

最佳答案

编译器只知道 aAnimal 。那是因为拥有它是完全合法的

class HairballException extends Exception {}

class Cat extends Animal {
    public void eat() throws HairballException {}
}

然后是a.eat();之前:

a = new Cat();

变量a可以是 Animal任何类。编译器不能假设 a仍然是Dog ,所以它必须强制它可以抛出 Exception .

如果你真的不想捕获ExceptionAnimaleat()方法可能会抛出,然后强制转换 aDog在调用eat()之前.

关于java - 重写有异常编译器错误的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783132/

相关文章:

c# - 如何从派生类中获取基类实例

makefile - Snow Leopard 上 FFMpeg 的 libavformat 位于哪里?

java - 在 Java UI 中检查组件层次结构

java - iText pdfReader 未在 ColdFusion 2018 中发布文件

python-3.x - 如何为抽象类方法构造函数添加类型注释?

javascript - 在 V8 中扩展 JavaScript 数组并维护 PACKED 类型

java - 将反射与模板一起使用时的Java编译错误

java - teplated类内的内部类对象的数组

java - 如何创建高级安卓用户界面?

java - java socket和android之间使用可序列化对象进行通信