Java - 是否可以在任何对象上调用接口方法?

时间:2017-07-04 18:54:53

标签: java methods interface

假设我有对象X和对象B.X是随机类的对象,后者又创建B,并将其自身传递以存储为对象B中的变量。

现在对象B想要在对象X中运行一个方法,而不知道它是什么类。

是否可以在任何对象中调用方法,如果存在具有该名称的方法,则运行,如果不存在,则不会运行。我假设一些try / catch可以解决这个问题。

但是我要说我有这样的事情:

public class ObjectB {

  public Object parentX;

  public ObjectB(Object x) {
    parentX = x;
  }

  public void anyMethod() {
    x.runMyMethod();
  }
}

在我使用过的另一个程序中,这可以通过接口实现,因此可以了解Java也是如此。但是,我似乎找不到设置它的方法。所以,如果是上面的情况,那么如何设置它,以便ObjectB可以在程序中的所有类上调用该方法,如果那是我想要的呢?

3 个答案:

答案 0 :(得分:2)

  

现在对象B想要在对象X中运行一个方法,而不知道它是什么类。

根本没有意义。要调用方法,您需要知道其名称和预期参数。从这个意义上讲,B级需要一些知识。因此,您可以/可以做类似

的事情
if (parentX instanceof ClassA) {
 ( (ClassA) parentX ) . someAMethod(bla, blub); 
} 
if (parentX instanceof InterfaceC) {
 ( (InterfaceC) parentX ) . someCMethod(bla, blub); 
}

从这个意义上讲:你可以在这里使用界面;但课程也有效。关键是:你需要一些信息;否则你就会陷入困境。

唯一的另一种选择是研究reflection - 然后你不需要知道具体的类型;因为你可以检查 parentX以找出可以在该对象上调用哪些方法。但反思是A)一种先进的概念,b)在使用中错综复杂。

答案 1 :(得分:1)

是的,这绝对是可能的。

定义界面MyIntf,您的Class X实现它。现在在B类中,您可以将Class X(或任何实现MyIntf的类)的对象分配给父类型MyIntf,您可以使用该父类调用方法

    interface MyIntf
    {
       void runMyMethod()
    }

    public class ObjectX implements MyIntf {
           void runMyMethod()
           {
           }
    }

    public class ObjectB { 

      public MyIntf parentX;

      public ObjectB(MyIntf x) {
        parentX = x;
      } 

      public void anyMethod() { 
        parentX.runMyMethod(); 
      } 
    } 

答案 2 :(得分:0)

如果您查看此documentation的结尾,它会告诉您有关投射的信息。转换允许程序假定对象属于某种类型并尝试调用其中的方法。

public void anyMethod() {
     ((MethodParentObject) this.x).runMyMethod();
}