Javaコンパイラの型判断

Javaのコンパイラは宣言された型情報のみを頼りにコンパイルを行う。
よって、A型にA型のサブクラスであるB型を代入するような場合でも、
メソッドの定義などはA型に定義されたものとして判断する。
もちろんオーバーライドによって実行時に実体に応じた挙動は実現できるのだが、
あくまで型判断は宣言したものとして行う。よってB型の定義なら問題なくても、A型として使用する際に問題があれば、コンパイルエラーになる。
具体的にはメソッドの例外の定義。
下記のコードのようにA型で例外をスローするメソッドをオーバーライドで例外をスローしないようにしても、4行目でA型として宣言している以上、5行目でtry-catch文を記述しないとコンパイルエラーになる。

public class Main {
	public static void main(String[] args) {
		A b = new B();
		b.hello();
	}
}
class A {
	public void hello() throws Exception {
		throw new Exception();
	}
}
class B extends A {
	public void hello() {
		System.out.println("B");
	}
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です