重载超载对比,再次

问题描述:

考虑以下Javainterface重载超载对比,再次

public interface Script<T> { 
    public T execute(Map<String,Object> args); 
} 

然后我们有一个

public interface SubScript<T> extends Script<T> { 
    public T execute(String knownTypeArgument, Map<String,Object> args); 
} 

这里knownTypeArgument总是由子execute方法需要。而在SubScript界面方法public T execute(Map<String,Object> args);是不需要的。

我的问题是它的标准/正确的做法是定义一个子接口只需添加一个参数还是两个?

会导致实现中的代码错误如果SubScript根本没有定义,并且knownTypeArgument通过了Map<String,Object> args

PS: 两个execute(String knownTypeArgument, Map<String,Object> args);execute(Map<String,Object> args);应该成为完全一样的目的,它只是在某些情况下execute将需要更多的信息。

PPS:每个计算器规则 正如我在寻找事实/分,我很想念,而不是讨论。

+2

您缺少的点已经在[您的上一个问题的答案]中指出(http://*.com/questions/15270889/override-disable-super-interface-method)。 – 2013-03-08 09:31:42

即使你写

而且在SubScript接口中的方法不需要public T execute(Map<String,Object> args);

这并不意味着execute(Map<String, Object) args)将在SubScript消失。这个接口将有两种方法。他们可能有相同的名字,但由于他们的签名不同,他们不会互相干扰。

SubScript的每个执行都必须执行这两个方法都是。当然,其中一种方法可以调用另一种方法,但这不是强制性的。

在你的情况下,任何类实现标就必须实现

public T execute(Map<String,Object> args); 

public T execute(String knownTypeArgument, Map<String,Object> args); 

为两个单独的重载方法,所以上面没有你需要的良好格局。

可能创建一个类做什么你的方法是专门做,用execute()方法不带参数,和setter方法来设置任何所需的参数。

接口应该被用于定义所需要对于给定的行为的方法和由此通常与“能够”后缀结束,如在拖动或定制的。

至于创建一个辅助接口只添加一个新的方法签名,建议使用方法重载。 Java允许具有相同名称的多个方法共存,但是具有不同的参数集合。你可以很容易地将这两种方法都放在同一个类/接口中,并根据需要调用。

+0

你说的是哪个建议?你从哪里得到这个“接口应该通常以'能够'的东西结束? – 2013-03-08 09:37:27

+0

@ arne.b [java api中接口命名的标准是什么](http://*.com/a/3939518/896567),java.lang.Appendable,java.lang.Cloneable,java.lang.Comparable, java.lang.Iterable,java.lang.Readable,java.lang.Runnable,java.io.Closeable,java.io.Externalizable,java.io.Serializable,...这不是绝对规则,但它是有道理的。 .. – Samy 2013-03-08 09:51:02

+0

您可能错过了第一句中的“没有正式约定”的部分,或者与官方命名约定的链接。肯定有很多接口实例,其中“可用”名称是有意义的(通常对于那些不能涵盖实现类的全部功能的接口),但在很多情况下它也不会(“List” ,'Set','Observer')。 OP的类和命名方法似乎暗示了后者。 – 2013-03-08 10:16:13