在方法参数中使用Object超类

use*_*099 0 java inheritance object

我的理解是Java中的每个类都是Object超类的子类.因此,为什么我的编译器给出了以下代码的错误:

public class ClassA {
   public ClassA(){}
   public String exampleMethod(String str){
      //manipulate string
      return str;
   }
}

public class ClassB {
   public ClassB(){}
   public String exampleMethod(String str){
      //manipulate string
      return str;
   }
}

public class Manager {
   public Manager(){
      execute(new ClassA());
      execute(new ClassB());
   }
   public void execute(Object o){
      o.exampleMethod("test");
   }
}
Run Code Online (Sandbox Code Playgroud)

如果ClassA是Object的子代,为什么我不能从'o'变量调用方法?我知道我可以将ClassA和ClassB放在超类下,但我想知道为什么会失败.

Lui*_*oza 5

因为Object类没有定义exampleMethod方法,所以给你错误.你应该至少做一个向下转换o ClassAClassB类来执行你的代码:

public void execute(Object o) {
    //this makes the code compiles
    ((ClassA)o).exampleMethod("test");
}
Run Code Online (Sandbox Code Playgroud)

但是,在执行此向下转换之前,您必须确保o参数是一个ClassAClassB实例,否则您可能会遇到ClassCastException异常.你可以通过使用instanceof:

public void execute(Object o) {
    //this makes the code compiles
    //and assures that you won't have a ClassCastException
    if (o instanceof ClassA) {
        ((A)o).exampleMethod("test");
    }
    if (o instanceof ClassB) {
        ((B)o).exampleMethod("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

不过,这非常笨拙.由于ClassAClassBclasses共享一个具有相同签名(相同名称,相同参数,相同返回类型)的方法,因此您可以使用具有此方法的接口以及make ClassAClassB类来实现它.例如:

interface IExample {
    String exampleMethod(String str);
}
public class ClassA implements IExample {
    //current implementation...
}
public class ClassB implements IExample {
    //current implementation...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将类中的代码缩短Manager为:

public void execute(Object o) {
    if (o instanceof IExample) {
        ((IExample)o).exampleMethod("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

public void execute(IExample o) {
    o.exampleMethod("test");
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以传递一个ClassA或者ClassBexecute方法的实例,它将根据每个类给出的实现来表现exampleMethod.