考虑接口
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
,即使它有不同的参数?
OR
我做错了吗?设计此规范的正确方法是什么?
答案 0 :(得分:5)
没有。覆盖方法时,它必须具有相同数量和类型的参数。目前,您在<{1}}中重载 execute
方法。
但是,您可以从SubInterface
的实施中致电execute(Map<String, Object> args)
execute(Argument extra , Map<String, Object> args)
。
答案 1 :(得分:3)
是否可以完全覆盖SuperInterfaces.execute SubInterface.execute即使它有不同的参数吗?
如果您被允许这样做,您将违反协议。
我做错了吗?
是的,当然。
设计此规范的正确方法是什么?
你不能违反协议。所以,你不能这样做。
答案 2 :(得分:0)
您的SubInterface
应该是abstract
班级。
然后,您可以实现final
的默认one-arg execute
实施,实际调用two-arg execute
。
答案 3 :(得分:0)
我怀疑我是否理解你的问题。 重写是在子类/接口中使用相同的参数(或子类型参数)重新定义方法。 在这里你重载方法。
作为一个界面,它不会允许覆盖。 bcz overriding是一个与defination相关的术语,但是接口方法没有。
答案 4 :(得分:0)
你可以做的最好的事情是@Deprecate(d)方法。
e.g。
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,我认为您将能够在子接口中为该方法创建一个默认方法,并在有人执行时抛出异常(当然实现类不应该实现该方法:)