オブジェクトのキャストとメソッドのオーバーライドを理解しようとしています。
私はコードを持っています:
public class ExceptionClass{
void m() throws SQLException{}
}
class A extends ExceptionClass{
void m() throws Exception{}
}
これにより、「例外 Exception は ExceptionClass.m() の throws 句と互換性がありません」というエラーが発生します。
次のように書いても同じです:
public class ExceptionClass{
void m() throws SQLException{}
}
class A extends ExceptionClass{
void m() throws RuntimeException{}
}
これはエラーを発生させず、メソッドも適切にオーバーライドされます。SQLException は Exception クラスから拡張されているため、サブクラスで「SQLException」を「Exception」に置き換えることはできません (オーバーライドされたメソッドのシグネチャを変更しています)。
しかし、私はこれをしました:
public class ExceptionClass{
void m() throws NullPointerException{}
}
class A extends ExceptionClass{
void m() throws RuntimeException{}
}
しかし、ここにはエラーはありません..! 上記の理由により、同じエラーが発生するはずだと思いました。
なぜこのように振る舞うかはわかりません。また、メソッド シグネチャで例外をスローするメソッドをオーバーライドするときに従うべき規則は何ですか。