[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10214] スーパークラス に戻り値型が異なるメソ ッドが追加されたら(読 書会の宿題)



高橋(徹)です。

7/27の読書会で、P.71の15行目から

“スーパークラスが後のリリースで新たなメソッドを追加して、不運に
もサブクラスで同じシグニチャで異なる戻り値型のメソッドを定義して
いたら、サブクラスはコンパイルできなくなります[JLS,8.4.6.3]。”

とありました。ここで、既にコンパイル済みのサブクラスと、メソッド
を新たに追加したスーパークラスを実行したらどうなるんだろう?とい
う疑問が出ていました。

まず、本文中で参照しているJLSの8.6.4.3項は、「オーバーライドと
隠蔽の必要条件」というタイトルで、メソッドがオーバーライドや隠蔽
の関係にあるとき、戻り値が異なるとコンパイルエラーとすることが規
定されています。ただし、コンパイルエラーについてだけ規定している
ので、既にコンパイル済みのバイナリについては触れていません。

この問題は、JLSの13章「バイナリ互換性」で取り上げられていました。
13章はけっこうボリュームがあって難しいですが、サブクラスを再コン
パイルせずに、スーパークラスだけ再コンパイルしても、バイナリ互換
性は維持されるので実行可能と読み取りました。ただし、サブクラスを
再コンパイルすればエラーになります。


---
Toru TAKAHASHI
http://www.alles.or.jp/~torutk/oojava/