3

インターフェイスを検討する

public interface SuperInterface {

  public void execute(Map<String,object> argument);

}

public interface SubInterface extends SuperInterface {

  public void execute(Argument extra , Map<String,Object> args);

}

引数が異なっていても、で完全にオーバーライドSuperInterfaces.executeすることは可能ですか?SubInterface.execute

また

私はそれを間違っていますか?この仕様を設計する正しい方法は何ですか?

4

5 に答える 5

5

いいえ。メソッドをオーバーライドするときは、同じ数とタイプの引数が必要です。現在、でメソッドをオーバーロードしています。executeSubInterface

ただし、の実装execute(Map<String, Object> args)からから呼び出すことはできます。execute(Argument extra , Map<String, Object> args)SubInterface

于 2013-03-07T12:12:41.457 に答える
3

引数が異なっていても、SuperInterfaces.executeをSubInterface.executeで完全にオーバーライドすることは可能ですか?

これを行うことが許可されている場合は、契約に違反することになります。

私はそれを間違っていますか?

はい、もちろん。

この仕様を設計する正しい方法は何ですか?

合意に従わないことはできません。だから、あなたはこのようにすることはできません。

于 2013-03-07T12:15:50.707 に答える
0

私はあなたの質問を理解しているかどうか疑問に思います。オーバーライドとは、同じ引数(またはサブタイプ引数)を使用してサブクラス/インターフェイスのメソッドを再定義することです。ここでは、メソッドをオーバーロードしています。

インターフェイスであるため、オーバーライドは許可されません。bczオーバーライドは定義に関連する用語ですが、インターフェースメソッドには定義がありません。

于 2013-03-07T12:19:55.650 に答える
0

あなたはクラスSubInterfaceでなければなりません。abstract

次に、デフォルトとfinal実装でone-arg execute実際にを呼び出すことができますtwo-arg execute

于 2013-03-07T12:14:17.417 に答える
0

できる最善のことは、メソッドを@Deprecate(d)することです。

例えば

    public interface SuperInterface {

      public void execute(Map<String,object> argument);

    }

    public interface SubInterface extends SuperInterface {

      @Deprecated
      public void execute(Map<String,object> argument);
      public void execute(Argument extra , Map<String,Object> args);

    }

このようにして、クラスメソッドの無効な使用について通知されます。Java8を待つ場合は、サブインターフェイスでメソッドのデフォルトメソッドも作成し、誰かが実行したときに例外をスローできると思います(もちろん、実装クラスはメソッドを実装しないでください:)

于 2014-03-31T10:33:52.777 に答える