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

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



村山です.

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

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

JavaVM Specificationでは「5.4.3.3 Method Resolution」の
部分がこれに当たると思います.

書き方は違いますが,多分結論は同じです.(当たり前か.f(^^;)

------
2.Method resolution attempts to look up the referenced 
  method in C and its superclasses:

 * If C declares a method with the name and descriptor
   specified by the method reference, method lookup succeeds.
 * Otherwise, if C has a superclass, step 2 of method lookup 
   is recursively invoked on the direct superclass of C.
------
要は,「宣言したのと同じメソッド名とメソッドディスクリプタ
(つまり引数と戻り値)を持つメソッドがあれば,メソッドルック
アップは成功する.」ということで,それ以上厳しいチェックは
しないようです.
#「5.4.4 Access Control」にもそれらしい記述はない模様.
#他に見落としてる可能性もないとは言い切れないが.

「Java言語的にはエラーでも他の言語では正しいかもしれないし,
JavaVMにとって危険な処理というわけでもないので,エラーには
しない.」ということだと思います.他にもJava言語的にはエラー
でもベリファイエラーにならないものが「例外処理」にあります.
(4.9.5 Exception Handlers)

#よく誤解されるけど,JavaVMはJava言語「専用」ではありません.
#(ついでにいうとインタプリタでもありません.)例えば某巨大
#企業が売り物にしてるようなマルチ言語開発とやらはJavaVM上
#でも可能なはずです.下手するとラベルを付け替えただけの同じ
#技術かもしれません.ただ,そんな馬鹿げたものを新技術として
#大々的に宣伝するなんて,今まで誰も考えなかったようですけどね.

あと,実装レベルで考えると,メソッドディスクリプタの比較
も文字列比較を繰り返すのではなく,参照の比較と等価な処理
(平たくいってC言語のポインタの比較)で実現すると思います.
となると,「戻り値だけ異なる」というのを検出するのは
パフォーマンスを著しく低下させる可能性があります.