2

Proj2のインターフェースを変更しようとしています。ただし、Proj1はすでにこのインターフェイスを使用しているため、新しいバージョンではコンパイルされません。

既存のメソッドを変更/削除した場合にのみ問題が発生するようですが、新しいメソッドを追加しても問題は発生しないようです。

インターフェイスにメソッドを「追加」するだけである限り、Proj1はProj2の最新のJarで問題ないと期待できます。

それは堅実で安全な仮定ですか?

更新:インターフェースとimplの両方がproj2にあります。Proj1には、そのインターフェイスの実装はありません。

4

4 に答える 4

3

いいえ。インターフェイスに新しいメソッドを追加したり、現在のシグネチャを更新したりするには、インターフェイスを実装したクラスでそれらのメソッドの実装を提供する必要があります。

ただし、インターフェイスから特定のメソッド宣言を削除すると、インターフェイスを実装するクラスで定義されていても、効果はありません。削除されたメソッドは、クラスの通常のメソッドとして機能し、インターフェイスの既存のコントラクトとは結びつきません。

私があなたの問題を解決することを考えることができる唯一の方法は、Javaを利用して、特定のクラスに複数のインターフェースを実装できるようにすることです。あなたがやるべきことは、新しいインターフェースを作成し、ここで新しいメソッドを定義し、proj2のクラスにもこのインターフェースを実装させることです。このように、新しいjarをパッケージ化しても、proj1の既存のクラスは影響を受けません。

于 2012-09-07T16:42:25.733 に答える
3

「使用する」とは、「インターフェイスを使用してオブジェクトを参照し、その参照を使用してインターフェイス定義のメソッドを呼び出す」ことを意味します。「インターフェイスを実装する」ではありません(はい、コメントで明確にしましたが、繰り返したいのは、すべて他の答えは、インターフェースの実装に関するものです)。

その場合、インターフェースからメソッドを削除したり、それらのシグネチャを変更したりしない限り、既存のコードは機能します。

これが機能する理由は、コンパイラがメソッド呼び出しを、インターフェイスクラスとメソッドを名前で参照するinvokeinterfaceバイトコードに変換するためです。実行時に、JVMは、実際の参照がインターフェースを実装していることを検証し、メソッドを呼び出します。

参照されるインターフェイスメソッドを削除または変更すると、次の2つのいずれかが発生します。インターフェイス参照を解決できなかったためにJVMがproj1でのクラスのロードを拒否するか、NoSuchMethodError(2番目だと思います) 。具象クラスの参照メソッドを削除または変更した場合も同じです。

于 2012-09-07T17:01:26.927 に答える
2

メソッドを追加するだけの場合は、2番目のインターフェースを作成します。Javaクラスは、複数のインターフェースを実装できます。そうすれば、Interface1を実装するクラスは同じままです。

新しいクラスは、インターフェイスInterface1とInterface2を実装します。

于 2012-09-07T16:47:11.317 に答える
0

エラーが発生します:

The type XXXImpl must implement the inherited abstract method IXXX.method()
于 2012-09-07T16:46:15.343 に答える