1

私は自分のコードで長い間存在し、多くのクラスがそれを実装しているインターフェースを使用しています。ここで、新しいクラス用にこのインターフェイスに新しいメソッドを追加する必要があります [古いクラスには新しいメソッドは必要ありません]。そのため、多くの場所で提案されているように、その古いインターフェイスを拡張して、新しいメソッドで新しいインターフェイスを作成できます。今私の問題は、インターフェース実装を使用するアプリランチャーが基本インターフェースへの参照しか持たず、基本インターフェースを使用して新しいインターフェースでメソッドを呼び出せないことです。

baseInterface is extended by newInterface

Class Applauncher{

  baseInterface b;

}

ご覧のとおり、Applauncher クラスの「newInterface」で新しいメソッドを呼び出すことはできません。

古い実装を揺るがさないソリューションが必要です。

4

2 に答える 2

6

基本的に、applauncherで新しいメソッドを呼び出す必要がある時点で、次のようなことを行うことができます。

if (b instanceof NewInterface) {
  ((NewInterface)b).newMethod();
}

それはあなたにとっての解決策でしょうか?

于 2013-03-08T12:39:38.277 に答える
4

確かにまだリリースされていませんが、Java 8 が登場すると、この一般的な問題に対する優れた解決策が得られるでしょう。

public interface MyInterface {
   Calendar myMethod();
   Object myMeth2() default null;
}

ここで重要な点はdefault null、default キーワードには 8 以降の新しい使用法があり、デフォルトの戻り値を指定できるようになっていることです (つまり、すべての実装でこのメソッドを実装する必要はありません)。

于 2013-03-08T12:44:41.333 に答える