2014-01-15 77 views
1

我在Java中有以下情形。比方说,我有一个接口和两个实现此接口的类。如下:调用方法没有在Java中实现的接口的接口中定义

公共接口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 
} 

上述调用代码似乎并不工作。有任何想法吗?

回答

14
myInterface myinterface = new B(); 

参考类型myinterfacemyInterface。这意味着您只能访问界面中定义的方法。您可以将其转换为键入B以进行方法调用。

备注:从这里开始,我将使用正确的命名约定。

MyInterface myInterface = new B(); 

String str = ((B)myInterface).printOtherStuff(); 

这个

如果你需要做到这一点,那么你需要看看你的类设计刚一说明。以这种方式使用interface的想法是从对象的具体实现的细节中抽象出来。如果你不得不像这样执行一个明确的演员表演,那么你可能想要考虑改变你的界面以适应必要的方法,或者改变你的课程,以便将该方法移动到全球位置(如util文件或东西)。

额外的阅读

你应该阅读有关引用类型here,你应该看看铸造here。我的答案是对这两件事的理解的结合。

作为补充说明,请看Java Naming Conventions。这是任何Java开发人员制作可理解代码的重要信息。

+1

+1。写得很好,详细的答案。 – Maroun

+0

谢谢!非常翔实的答案。特别感谢关于命名约定的提示。 :) – rameezk

1

当然,这不会工作,因为你有参考类型Interface MyInterface。在方法绑定编译器会尝试在您的Interface MyInterface中找不到此方法。所以你需要把它像这样扔给你的班级。

MyInterface myInterface = new B(); 
    B newB=(B) myInterface ;//casting to class 
    newB.printOtherStuff();// would work fine