【问题标题】:Java - Is it possible to call an interface method on a any object?Java - 是否可以在任何对象上调用接口方法?
【发布时间】:2017-07-04 18:54:53
【问题描述】:

假设我有对象 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 可以在我的程序中的所有类上调用该方法,如果这是我想要的?

【问题讨论】:

  • 如果您想调用该方法,x 必须是实现该接口的类的实例。 (你的意思是parentX?)
  • 不,唯一的方法是使用反射,但反射在大多数情况下不是正确的答案。您可能应该通过修复您的设计来做到这一点。但是,如果不知道自己想要达到什么,在更高的层次上,就很难回答。
  • 使用接口,而不是Object作为xparentX的类型。
  • 其他一些语言是解释型的(或部分解释型的),也就是说当你在一个对象上调用一个方法时,程序可以在调用发生时搜索该对象,看看该对象是否定义了一个方法用那个名字。 Java 不是这样的。它想在编译时知道对象是否有需要的方法。

标签: java methods interface


【解决方案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】:

    现在对象 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) 其使用复杂。

    【讨论】:

      【解决方案3】:

      如果您查看此documentation 的末尾,它会告诉您有关铸造的信息。强制转换允许程序假定对象是一种类型并尝试调用其中的方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 2010-10-28
        相关资源
        最近更新 更多