0

次のJavaクラスを検討してください。

public class Animal {
    public static void printText(Object obj) {
        System.out.println(obj.toString());
    }
}

class Tiger extends Animal {
    // Contains some unimportant methods.
}

そして今、mainメソッドに以下を入力すると、そのキャストでエラーが発生しても、コンパイラーはエラーを出しません。なんで?

public static void main(String[] args) {
    Animal animal = new Animal();
    ((Tiger)animal).printText(animal);  // <= ?? no error in the compiler ??
}
4

2 に答える 2

3

あなたの例では、キャストが間違っていることを簡単に知ることができますが、一般的な場合はそうではありません。

同様Animal getRandomAnimal()に戻る可能性のあるメソッドがある場合はどうなりますか。Tiger(または、より一般的なケースでは、Animal getAnimal()サブクラスによってオーバーライドされてを返す可能性のあるメソッドTiger)。

コンパイル時に、あなたはおそらく

Tiger tiger = (Tiger)getRandomAnimal();

が有効かどうかは、実行時にのみわかります

于 2013-02-03T14:09:19.103 に答える
1

一般に、これはコンパイル時に検出できないためです。例えば:

Animal a = (someCondition) ? new Animal() : new Tiger();

((Tiger)animal).printText(animal);
于 2013-02-03T14:09:32.253 に答える