Java—可以在任何对象上调用接口方法吗?

Java—可以在任何对象上调用接口方法吗?,java,methods,interface,Java,Methods,Interface,假设我有对象X和对象B。X是一个随机类的对象,它反过来创建了B,并将自身作为变量存储在对象B中 现在,对象B想要在对象X中运行一个方法,而不知道它是什么类 是否可以在任何对象中调用方法,如果存在具有该名称的方法,则该方法将运行,如果不存在,则不会运行。我想一些try/catch可以解决这个问题 但假设我有这样的东西: public class ObjectB { public Object parentX; public ObjectB(Object x) { parentX

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

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

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

如果你看这篇文章的结尾,它会告诉你关于铸造。强制转换允许程序假定对象是一种类型,并尝试调用其中的方法

public void anyMethod() {
     ((MethodParentObject) this.x).runMyMethod();
}
现在,对象B想要在对象X中运行一个方法,而不知道它是什么类

根本没有道理。为了调用一个方法,您需要知道它的名称和预期的参数。从这个意义上说,B班需要一些知识。因此,你会/可以这样做

if (parentX instanceof ClassA) {
 ( (ClassA) parentX ) . someAMethod(bla, blub); 
} 
if (parentX instanceof InterfaceC) {
 ( (InterfaceC) parentX ) . someCMethod(bla, blub); 
}
从这个意义上说:您可以在这里使用一个接口;但课堂也很有效。关键是:你需要某种信息;否则你就会被卡住

唯一的另一种选择是调查——这样你就不需要知道具体的类型;正如您可以检查
parentX
以了解可以对该对象调用哪些方法一样。但是反射是A)一个先进的概念,b)其用法错综复杂

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

根本没有道理。为了调用一个方法,您需要知道它的名称和预期的参数。从这个意义上说,B班需要一些知识。因此,你会/可以这样做

if (parentX instanceof ClassA) {
 ( (ClassA) parentX ) . someAMethod(bla, blub); 
} 
if (parentX instanceof InterfaceC) {
 ( (InterfaceC) parentX ) . someCMethod(bla, blub); 
}
从这个意义上说:您可以在这里使用一个接口;但课堂也很有效。关键是:你需要某种信息;否则你就会被卡住


唯一的另一种选择是调查——这样你就不需要知道具体的类型;正如您可以检查
parentX
以了解可以对该对象调用哪些方法一样。但是反射是A)一个先进的概念,b)其用法错综复杂

是的,这是绝对可能的

定义接口
MyIntf
,然后您的
classx
实现它。现在在类B中,您可以将
类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(); 
      } 
    } 

是的,这是绝对可能的

定义接口
MyIntf
,然后您的
classx
实现它。现在在类B中,您可以将
类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(); 
      } 
    } 

如果要调用该方法,
x
必须是实现该接口的类的实例。(你是说
parentX
?)不,唯一的方法是使用反射,但反射在大多数情况下不是正确的答案。您可能应该通过修改设计来实现这一点。但是在不知道您想要在更高级别上实现什么的情况下,很难回答。使用接口,而不是将
Object
作为
x
parentX
的类型。一些其他语言会被解释(或部分解释),这意味着当您对对象调用方法时,程序可以在调用发生时搜索对象,以查看对象是否定义了具有该名称的方法。Java不是这样的。它希望在编译时知道对象是否具有所需的方法。如果要调用该方法,
x
必须是实现该接口的类的实例。(你是说
parentX
?)不,唯一的方法是使用反射,但反射在大多数情况下不是正确的答案。您可能应该通过修改设计来实现这一点。但是在不知道您想要在更高级别上实现什么的情况下,很难回答。使用接口,而不是将
Object
作为
x
parentX
的类型。一些其他语言会被解释(或部分解释),这意味着当您对对象调用方法时,程序可以在调用发生时搜索对象,以查看对象是否定义了具有该名称的方法。Java不是这样的。它希望在编译时知道对象是否具有所需的方法。