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

不可以。当您覆盖一个方法时,它必须具有相同数量和类型的参数。目前,您正在重载execute.SubInterface

但是,您可以execute(Map<String, Object> args)从.execute(Argument extra , Map<String, Object> args)SubInterface

于 2013-03-07T12:12:41.457 回答
3

是否可以用 SubInterface.execute 完全覆盖 SuperInterfaces.execute ,即使它有不同的参数?

如果您被允许这样做,您将违反协议。

我做错了吗?

是的当然。

设计此规范的正确方法是什么?

你不能不遵守协议。所以,你不能这样做。

于 2013-03-07T12:15:50.707 回答
0

我怀疑我是否理解你的问题。覆盖是重新定义具有相同参数(或子类型参数)的子类/接口中的方法。在这里,您正在重载方法。

作为一个接口,它不允许覆盖。bcz 覆盖是一个与定义相关的术语,但接口方法没有。

于 2013-03-07T12:19:55.650 回答
0

SubInterface应该是一abstract堂课。

然后你可以有一个默认值和实际调用final的实现。one-arg executetwo-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 回答