Java 向接口添加新方法

Java 向接口添加新方法,java,Java,我在代码中使用了一个接口,这个接口已经存在很长时间了,很多类都实现了它。 现在我必须为一个新类向这个接口添加一个新方法[旧类不需要新方法]。因此,正如许多地方建议的那样,我可以扩展旧接口,并使用新方法创建新接口。 现在我的问题是,使用接口实现的应用程序启动器只引用基本接口,而使用基本接口,我不能在新接口中调用方法 baseInterface is extended by newInterface Class Applauncher{ baseInterface b; } 所以可以看出

我在代码中使用了一个接口,这个接口已经存在很长时间了,很多类都实现了它。 现在我必须为一个新类向这个接口添加一个新方法[旧类不需要新方法]。因此,正如许多地方建议的那样,我可以扩展旧接口,并使用新方法创建新接口。 现在我的问题是,使用接口实现的应用程序启动器只引用基本接口,而使用基本接口,我不能在新接口中调用方法

baseInterface is extended by newInterface

Class Applauncher{

  baseInterface b;

}
所以可以看出,我不能在Applauncher类的newInterface中调用新方法


我想要一个不会动摇我的旧实现的解决方案。

基本上,当您需要在applauncher中调用新方法时,您可以这样做:

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

这对您来说是一个解决方案吗?

基本上,当您需要在applauncher中调用新方法时,您可以执行以下操作:

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

这对您来说是一个解决方案吗?

诚然,尚未发布,但当Java 8面世时,您将有一个很好的解决方案:

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

重要的一点是默认的空位-默认关键字从8开始有了新的用法,允许您指定默认返回值,这意味着您不需要在所有实现中实现此方法。

诚然,尚未发布,但当Java 8面世时,您将有一个很好的解决方案:

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

重要的一点是默认的空位-默认关键字从8开始有了新的用法,允许您指定默认的返回值,这意味着您不需要在所有实现中实现此方法。

如果只有一个类使用此方法,为什么需要在接口中添加此方法?目前只有一个类使用它必须实现baseInterface+新方法。这个问题有点让人困惑-你是说你的Applauncher类不能更改,并且持有对baseInterface的引用-但实际存储的引用是对newInterface的?如果是这样的话,我想你也许能够解决你的铸造问题。newInterface asNew=newInterface b,其中b是baseInterface类型的变量,它实际存储对newInterface的引用。为什么不直接将所需的方法添加到新类中,而不将其添加到接口中?是的,Applaunch类不应该更改。我需要在AppLauncher中调用newInterface.newMethod,但当前的实现无法做到这一点。您正在向下转换,即基类到子类,java应该抛出异常,不是吗?如果只有一个类在使用这个方法,为什么你需要在你的接口中添加这个方法?目前只有一个,它必须实现baseInterface+新方法。问题有点让人困惑-你是说你的Applauncher类不能更改吗,并保存对baseInterface的引用-但实际存储的引用是对newInterface的引用?如果是这样的话,我想你也许能够解决你的铸造问题。newInterface asNew=newInterface b,其中b是baseInterface类型的变量,它实际存储对newInterface的引用。为什么不直接将所需的方法添加到新类中,而不将其添加到接口中?是的,Applaunch类不应该更改。我需要在AppLauncher中调用newInterface.newMethod,但当前的实现无法做到这一点。你正在做向下转换,即基类到子类,java应该抛出异常,不是吗?我同意,我会寻找一个更简洁的解决方案,但如果我没有其他方法,那么你的方法将最适合我。是的,这不是一个你想用得太多的解决方案,但在像你这样的情况下,它是有意义的…我同意,我会寻找一个更简洁的解决方案,但如果我没有其他方法,那么你的方法将最适合我。是的,这不是一个你想使用太多的解决方案,但在像你这样的情况下,它是有意义的。。。