我在Java中有以下场景。假设我有一个接口,以及两个实现此接口的类。如下:
public interface myInterface {
public String printStuff();
}
公共类A实现myInterface {
@Override public String printStuff(){ return "Stuff"; }
}
公共类B实现myInterface {
@Override public String printStuff(){ return "Stuff"; } public String printOtherStuff(){ return "Other Stuff"; }
}
如果我按如下方式定义它,如何调用上面的printOtherStuff方法:
public void Main(){
myInterface myinterface = new B();
String str = myinterface.printOtherStuff(); // ? This does not work
}
上面的调用代码似乎不起作用。有什么想法吗?
答案 0 :(得分:17)
myInterface myinterface = new B();
myinterface
的引用类型为myInterface
。这意味着您只能访问界面中定义的方法。您可以将其强制转换为B
,以便进行方法调用。
注意 :从现在开始,我将使用正确的命名约定。
示例强>
MyInterface myInterface = new B();
String str = ((B)myInterface).printOtherStuff();
只需注意
如果您需要这样做,那么您需要查看您的课堂设计。以这种方式使用interface
的想法是抽象出对象具体实现的细节。如果您必须执行这样的显式转换,那么您可能需要查看更改接口以适应必要的方法,或者更改类以便将方法移动到全局位置(如{{1}文件或其他东西)。
额外阅读
您应该阅读有关引用类型here的内容,您应该看一下转换here。我的答案是对这两方面的理解的结合。
作为补充说明,请查看Java Naming Conventions。对于任何Java开发人员来说,这都是制作可理解代码的重要信息。
答案 1 :(得分:1)
当然,这不起作用,因为您的引用类型为Interface MyInterface
。在方法绑定时,编译器会尝试在Interface MyInterface
中找到此方法,该方法不可用。所以你需要像这样把它投射到你的班级。
MyInterface myInterface = new B();
B newB=(B) myInterface ;//casting to class
newB.printOtherStuff();// would work fine