私はチュートリアルポイントでインターフェースについて読んでいて、次のことに出くわしました。
「チェックされた例外は、インターフェースメソッドによって宣言されたもの、またはインターフェースメソッドによって宣言されたもののサブクラス以外の実装メソッドで宣言されるべきではありません。」
誰かが私にこれが何を意味するのか説明できますか?
私はチュートリアルポイントでインターフェースについて読んでいて、次のことに出くわしました。
「チェックされた例外は、インターフェースメソッドによって宣言されたもの、またはインターフェースメソッドによって宣言されたもののサブクラス以外の実装メソッドで宣言されるべきではありません。」
誰かが私にこれが何を意味するのか説明できますか?
これは、インターフェイスのメソッドがチェック済み例外 E をスローすると宣言した場合、一部のクライアント コードが使用するインターフェイスよりも、このチェック済み例外を (try-catch またはさらにスローすることによって) 明示的に処理する必要があることを意味します。I を実装するクラス C でさらにチェック例外 (E1) を宣言しようとすると、アプリケーションのロジックが壊れます。I のクライアントは、E 以外にスローされる例外についてまったくわかりません。
実際、コンパイラはそれを許可しません
チェック例外は、それらをスローする可能性のあるメソッドの型シグネチャで宣言する必要がある例外です。その引用が言っていることは、インターフェイスを実装するクラスは、インターフェイスから実装するメソッドのシグネチャにチェック例外を追加してはならないということです。
したがって、次のようなインターフェースがある場合:
interface NoExceptions{
void safeMethod();
}
次のようなクラスを宣言することは禁止されています。
class UnsafeClass{
@Override
void safeMethod() throws IOException{}
}
型シグネチャを変更しているためです。代わりに、これらの例外はメソッド内で処理する必要があります。
これは、チェックされた例外のポイントが、発生する可能性のある問題を呼び出し元のコードが確実に処理することであるためです。サブクラスに例外を追加しようとすると、その安全性が失われます。
UnsafeClass uc = new UnsafeClass();
uc.safeMethod(); //Not allowed, because the exception is not handled
NoExceptions ne = uc;
ne.safeMethod(); //Becomes allowed, because the interface does not declare an exception
そのため、そのような例外を追加することは禁止されています。
ただし、インターフェースで宣言されたチェック済み例外のサブクラスをスローする実装を作成することはできます。サブクラスはスーパークラスのドロップイン置換として使用できるため、これは常に安全な操作です。