Javaライブラリのインターフェイスを実装するクラスを作成しようとしています。特定のインタフェースが質問に関連してはいけませんが、ResultSetは具体的である必要があります。 (私はいくつかの追加機能を提供する通常のResultSetの上にレイヤーを置く必要がありますが、私は "通常の"関数を通過させたいと思います。そして、私は通常のResultSetまたは私の "強化された" ResultSet)。複数のバージョン間でインターフェイスを実装しています
私の問題は:クラスがJava 5とJava 6の両方で正常にコンパイルされるようにこれを行う方法はありますか?
Java 6のResultSetインターフェイスには、Java 5で定義されていないオブジェクトを返す関数が多数あります。これらの関数をインクルードすると、未定義の型を参照しているため、Java 5ではクラスがコンパイルされません。しかし、もし私がこれらの関数を含んでいなければ、インタフェースを完全に実装していないので、Java 6で私のクラスはコンパイルされません。私はキャッチ22の何かにこだわっているようだ。私は実際にこれらの関数のどれも必要としません - 実際に私の実装は単にそれらのすべてのための "実装されていない"例外をスローします。
プログラマーの中にはJava 5を実行しているものもあれば、Java 6を実行しているものもあります。私たちの生産環境はJava 5です。私たちはより完全な世界ではすべて同じバージョンを実行していると思います。しかし、この場合問題を解決するために私の環境を変更することができたとしても、確かにこの問題はオープンソースプロジェクトで発生します。 Java 5で動作するように自分のコードを変更した場合、遅かれ早かれJava 6にアップグレードするとクラスが壊れてしまい、かなり迷惑に見えます。
更新
まあ、与えられた回答をいただきありがとうございます。むしろ、この注釈を追加するか、ここに「W」という文字を入力すれば、それはすべて魔法のように機能します。そのような運はないと思います。
すべての回答は(このアップデートの時点で)とにかく良い点を示していますので、私はそれらのすべてをアップしてしまいました。私は自分のフラストレーションを最もよく表しているものに「ベストアンサー」の賞を与えました。 :-)
私の本当の解決策は、ResultSetを実装するアイデアを放棄し、代わりにResultSetの関数を含む新しいインターフェイスを作成して、動作させる必要があると思います。私はこれを感情的には満足していないが、代わりのものよりも良いと思われる。
これは静的な型の安全性を破壊し、大量の定型文を書くことを伴います。エラーが発生しやすく、効率が悪くなります。しかし、それは間違いなく動作します! –
@Tom Anderson *これは静的型の安全性を破壊します*私は知っています。しかし、コンパイル時の安全性を確保するためには、CGLIBなどを使用する必要があります。 –