混合Javaバージョンの世界でジェネリックを使用する方法は?
-
10-07-2019 - |
質問
ジェネリック医薬品が大好きで、できる限り使用しています。時々、古いJVM(5.0以前)で実行する必要がある別のプロジェクトでクラスの1つを使用する必要があり、JavaME(ジェネリックはどちらも許可されていない)またはMicrosoft J#(非常に貧弱です)で実行する必要がありますジェネリックのサポート)。
現時点では、すべてのジェネリックを手動で削除します。つまり、多くのキャストも挿入します。
ジェネリックはコンパイル時のみであると言われており、ジェネリックコードのすべての部分が非ジェネリックコードに自動的に変換される可能性があるため、これを行うことができるツールはあるのでしょうか。
そのようなツールがない場合、他にどのように問題を解決できますか?ジェネリックの使用を完全に停止すべきですか?
バイトコードの互換性に関連する回答が既にあります。何らかの理由でソースコードの互換性が必要な場合はどうなりますか?
解決
この種のことを実現するには、 Retroweaver のようなものを使用する必要があります。この質問に対する他の答えは、少し誤解を招きます。ジェネリックは、以前のバージョンとはバイトコードの互換性がありますが、完全ではありません(信じられない場合は、 java.lang.reflect.Type
を参照してください)。また、1.5に対してコンパイルされたクラスが以前のバージョンで実行されないようにするバイトコードバージョン属性の問題があります。 Retroweaverは両方の問題を回避しながら、注釈や列挙型などの他のJava 5機能も有効にします。
他のヒント
Netbeans(使用しているIDEについてはわかりません)では、ソースコードの互換性をJavaバージョンのセットに設定できます。ジェネリックをサポートするバージョンに設定するだけです。既に投稿されているように、ジェネリックは古いJVM / JREバージョンと互換性のあるバイトコードであるため、すぐに使用できるはずです。
私の知る限り、Java 5はJava 1.4とバイトコード互換性がありません 。つまり、Java 5でコンパイルされたクラスを以前のVMで使用することはできません。
retroweaverを確認できます。これはジェネリックが導入されたときに多く言及されました。個人的には経験がありません。
Googleに尋ねましたか?検索結果 http://www.publicobject.com/glazedlists/documentation/ Generics_and_Java_1.4_with_one_codebase.pdf 。これは非常に興味深いアプローチのようです。
バイトコードと互換性があり、古いインタプリタですぐに動作するはずです。