最初の質問、物語は続きます:
クラス階層で異なるバイトコードバージョンを混在させても安全ですか?リスクは何ですか?
あるケースでは、クラスCはBを拡張し、クラスBはクラスAを拡張します。クラスAはインターフェイスIを実装します。私の質問には、次のシナリオ例が含まれます。
- クラスAはJava1.6バイトコードにコンパイルされ、ジェネリックなどの1.6の機能を備えています。BとCの相続人は1.4バイトコードにコンパイルされました。
- インターフェイスは1.6にコンパイルしましたが、実装者は1.4にコンパイルしました。
- 異なるバージョンのバイトコードを含む他のエキゾチックな継承シナリオ。
私は想像できる限り多くのシナリオを試しましたが、うまくいくようです。しかし、私は表面上はJavaしか知らないので、ここで質問したいという衝動をまだ感じています。私はJavaのコーディングと微調整の方法を知っていますが、内部で何が起こっているのか本当にわかりません。
さて、「なぜあなたはそれをする必要があるのか?」と自問するのを助けることができないそれらの心のために。
私は、RMIを介してEJB2に接続されているレガシーJava1.4 Swingアプリから、1.6上で実行されている新しいバージョンのAppServerに接続されているJava1.6Swingへの移行を評価するプロジェクトに参加しています。J2EEプラットフォームは1.4(EJB 2)のままです。
移行は「すべてを1.6に再コンパイル」するのではなく、「新機能を1.6にコード化してコンパイルする」ことになります。彼らのやり方は次のようなものです。CVSにはパスが1つしかないので、全員がそこでコミットします。プロダクションコードを取得するためのタグ/ブランチは一切ありません。新しい機能を追加する必要があるときはいつでも、本番サーバーからJARを取得し、それらを分解し、必要に応じて新しいクラスを置き換えまたは追加し、jarを再パッケージ化して、サーバーに戻します。したがって、Java 6を使用してコンパイルし、上記のデプロイメント方法を使用する場合、1.4バイトコードと1.6バイトコードのエキゾチックな組み合わせが多数存在します。