9

私の理解では、ソース互換性を維持するために、Java はパブリック インターフェイスに新しいメソッドを導入することはありません。インターフェイスを実装している既存のクライアントが機能しなくなるためです。 Java リリース ノートの状態

一般に、ポリシーは次のとおりです。ただし、以下にさらにリストされている非互換性を除きます。

  • メンテナンス リリース (1.4.1、1.4.2 など) では、新しい言語機能や API は導入されません。それらは相互にソース互換性を維持します。

  • 機能リリースとメジャー リリース (1.3.0、1.4.0、5.0 など) は上位のソース互換性を維持しますが、下位のソース互換性は維持しません。

それでも、パッケージは進化java.sqljavax.sql続け、多くの互換性のない変更が導入されています。たとえば、次の互換性のない変更に気付きました (Java 6 で導入)。

これらのメソッドが追加された方法と理由を知っていますか? java.sql他のプラットフォームとは異なる扱いを受けていますか? これらの追加に関する議論/JSR を知っていますか?

4

4 に答える 4

9

Sun の開発者から次の返信がありました。

JDK 7 などの機能リリース用の JDK の API の一般的な進化ポリシーは次のとおりです。

  1. バイナリ互換性を壊さないでください (JLSv3 の第 13 章で定義されているように)
  2. ソースの非互換性を導入しないようにする
  3. 動作の互換性の変更を管理する

(さらに、さまざまな種類の互換性について読みたいと思うよりもはるかに多くのことについては、

「互換性の種類: ソース、バイナリ、および動作」 および 「互換性のある進化する BigDecimal」

インターフェイスへのメソッドの追加は、バイナリ互換性がありますが、ソース互換性がないため、一般的には行われません。一般に、インターフェイスが広く実装されているほど、それにメソッドを追加する可能性は低くなります。JDBC 領域はこのポリシーの例外であり、より緩やかなアップグレード ルールを使用しますが、新しい JDK リリースへのアップグレードを希望する場合、実際の問題が発生します。

于 2009-08-11T19:42:19.860 に答える
4

新しいメソッドを追加すると、ソースの互換性が損なわれるだけであり、JDBC ドライバーの、StatementまたはResultSetJDBC ドライバー内の既にコンパイルされた実装は、新しい JDK で引き続き実行されることに注意してください。新しいメソッドを呼び出そうとしたときにのみ、NoSuchMethodError.

于 2009-08-11T16:37:51.853 に答える
1

Sunは、リリース間のソース互換性を保証することはなく、バイナリ互換性のみを保証します。最も一般的な例は、「assert」または「enum」識別子を含むソースコードがJDK 1.4(assertの場合)または1.5+(enumの場合)ではコンパイルされないが、既存の.classファイルはこれらの新しいJVMで引き続き実行されることです。

-sourceフラグを使用して、新しいJVMで古い.javaファイルをコンパイルしてみることができますが、変更されたjvmクラスに依存している場合は、問題が発生する可能性があります。

于 2009-08-11T16:59:43.447 に答える
1

彼らはおそらく、これらのメソッドを実装するデータベース ドライバ ベンダーが新しい Java ランタイムを最新の状態に保ち、便利な新しいメソッドを導入して一時的に互換性を破る方がよいと考えています。

もちろん、互換性を壊す必要がないように、より適切に設計できたはずです…</p>

于 2009-08-11T16:31:26.250 に答える