如何在该接口类型的对象上调用实现接口的类中的方法?

时间:2015-10-31 18:45:43

标签: java methods interface

我有一个实现接口的类,但有一些额外的方法。我无法编辑接口以添加任何额外的方法,该接口的一种方法返回一种接口本身。

public interface ExampleInterface{
    public ExampleInterface method1();
}

该类有一个我想使用的额外方法,它将打印该类的内容。

public class ExampleInterfaceImpl implements ExampleInterface {
    public ExampleInterface method1() {
        //method code
    }
    public void print() {
        //print method code
    }
}

所以我的问题是我是否有 ExampleInterface 类型的对象,即 method1()返回的对象,然后我想用打印它print(),如果 print() ExampleInterfaceImpl 中,怎么办呢,所以不能在 ExampleInterface类型的对象上调用

7 个答案:

答案 0 :(得分:1)

检查ExampleInterface对象是否为instanceof ExampleInterfaceImpl。然后你可以把它投射到那个并调用方法 - ((ExampleInterfaceImpl)object).print();

答案 1 :(得分:1)

public void maybePrint(ExampleInterface obj) {
    if (obj instanceof ExampleInterfaceImpl) {
        ((ExampleInterfaceImpl)obj).print();
    }
}

这适用于特定的实现类,但是如果你有几个不同的实现可能会或可能不会实现print()方法(在这种情况下,你应该使用print()方法创建一个子接口,并在所有适用的课程。)

还可以使用反射来检查对象的类是否具有print()方法,但这不是很优雅,也不推荐。

答案 2 :(得分:1)

如果你真的无法修改界面,你将不得不求助于runttime类型检查和转换:

if (myObject instanceof ExampleInterfaceImpl) {
    ((ExampleInterfaceImpl) myObject).print();
}

答案 3 :(得分:1)

如果您无法更改界面,我建议您添加一个可以使用的界面。

interface MyExampleInterface extends ExampleInterface {
    MyExampleInterface method1();
    void print();
}

class MyExampleInterfaceImpl implements MyExampleInterface {

// later
MyExampleInterface mei = new MyExampleInterfaceImpl();
mei.method1().print();

答案 4 :(得分:1)

首先来自评论@RealSkeptic,对您的问题实施toString方法是正确的。如果不是

更好的设计是创建另一个可以Printable喜欢

的界面
public interface Printable {
    void print();
}

并实现所有可打印的类,在您的情况下为ExampleInterfaceImpl并检查对象类型,如下所示

if(object instanceof Printable) {
    Printable object = (Printable) object; //this can be ExampleIntefaceImpl object
    object.print(); //is valid
}

答案 5 :(得分:1)

如果object存储在接口引用中,则需要将该引用强制转换为具体类。

      ExampleInterface exampleInterface = new ExampleInterfaceImpl();

    ((ExampleInterfaceImpl)exampleInterface).print();

答案 6 :(得分:1)

  

所以我的问题是我是否有一个类型为ExampleInterface的对象,即   method1(),

返回的内容

您可以通过引用接口类型ExampleInterface

来创建类MyExampleInterfaceImpl的对象
ExampleInterface mei = new MyExampleInterfaceImpl();

当您调用method1(),即mei.method();时,它只是从已实现接口ExampleInterface的具体类中调用该方法

  

怎么能看到print()在

简单地将ExampleInterface的引用变量显式转换为MyExampleInterfaceImpl() 然后调用方法print()

 ((ExampleInterfaceImpl)mei).print();

more on explicit casting