2

次のコードは、未処理の例外が原因でコンパイルされませんが、問題はないように思われます。

class Car {
    public void drive() throws Exception {
        System.out.println("Driving...");
    }
}

public class Sedan extends Car {
    public void drive() {
        System.out.println("Driving Sedan...");
    }
    public static void main(String[] args) {
        Car c = new Sedan();
        c.drive(); //unhandled exception!
    }
}

c.drive()オーバーライドするメソッドが呼び出されたときに、チェック済み例外がスローされないことは、コンパイラにとって明らかであるべきではありませんか? 参照が Sedan 型ではなく Car 型であるという理由だけで、チェック済み例外をスローするかのように drive を扱わなければならないのはなぜでしょうか? オーバーライド メソッドはそうではありません。

4

2 に答える 2

5

残念ながら、いいえ、コンパイラには明らかではありません。

コンパイラは基本的にCar cと への呼び出しを調べていますdrivecコンパイラは、指しているオブジェクトの実行時の型を認識していません。Car.drive()このため、 を含む のメソッド シグネチャを評価しthrows Exceptionます。

より明確にするために、他のメソッドで、まだこの例外をスローcするオブジェクトに再割り当てされた場合はどうなるでしょうか? コンパイラは、メソッドが呼び出されるSUVまでにオブジェクトの状態を知る方法がありません。drive

于 2016-08-23T13:25:24.887 に答える
0

あなたはそれを修正することができます

1.

Sedan c = new Sedan();
c.drive();

2.

また

Car c = new Sedan();
((Sedan) c).drive();
于 2016-08-23T13:30:21.040 に答える