1

変更されたAPIに関する実際の問題が発生しました。そして、私はこのトピックについてもっと知りたいです。次の例をデモとして使用します。

4つの単純なクラスがあり、ChildクラスはParentを拡張します。PubAPIは、cientで使用するためのパブリックメソッドを提供するクラスです。クライアントクラスは、PubAPIのパブリックメソッドを呼び出します。

public class Parent
{
}

public class Child extends Parent
{
}


public class PubAPI
{
public Parent getChild(){
    return new Child();
}
}


public class Client
{
public static void main(String[] args)
{
    System.out.println(new PubAPI().getChild());
}
}

最初の3つのクラスはAPIメーカーによって提供され、上記のバージョンがバージョン1であるとします。

バージョン2では、PubAPIクラスが変更されて子タイプを返します。

public class PubAPI
{
public Child getChild(){
    return new Child();
}
}

3 APIプロバイダークラスは現在バージョン2にありますが、「Client」クラスを再コンパイルせず、バージョン1で生成されたクラスファイルを使用する場合。ITはJavaランタイムで失敗し、バージョン1のメソッドが見つからないというエラーが発生します(リターンタイプが変更されたため)。

私はこれまで知りませんでした。たとえば、パブリックAPIがスローを追加したり、同期を追加したり、クラスが最終的になったりするなど、誰かがこのトピックについてもっと知っているかどうかを知りたいです。このような状況では、どのようになりますかそれはhehave。

全体として、他の人が使用するAPIクラスのパブリックAPI/クラスバイトコードレベルの互換性ルールは何ですか。

ありがとう。

4

1 に答える 1

2

編集:あなたは2週間前にほぼ同じ質問をし、答えを受け入れました。何がきっかけでもう一度聞いたのかしら、2週間でルールが変わるとは思わなかったでしょう?

あなたはキーワードバイトコードレベルの互換性で正しい方向に進んでいます。これはバイナリ互換性と呼ばれ、ネットで調べることができます。たとえば、ここ

ルールは最初は必ずしも理解しやすいとは限りませんが、エラーが発生して考えたときに通常は意味があります。最善の方法は、リストした個々のケースを試して、JLSで非互換性であるエラーを確認してから、その理由を自分で合理化することです。

この質問は、まったく同じ問題を議論しているようです。eclipse itサイトのドキュメントは、JLSよりも読みやすいです。

于 2011-09-22T03:42:21.283 に答える