Java调用子类方法

时间:2012-12-20 14:47:20

标签: java arraylist superclass

当我尝试创建一个类的实例并将其添加到我的arraylist时,我无法调用该子类中定义的方法。

我如何使这项工作?

列出类

import java.util.*;
public class List {
  private ArrayList<Person> persons;
  public List(){
    persons = new ArrayList<Person>();
  }
  public void addAssistant(){
    Person person = new Assistant();
    persons.add(person);
    if(person instanceof Assistant){
      person.assist();
    }
  }
}

人员类

public class Person {
  public Person(){}
}

助理班级

public class Assistant extends Person {
  public Assistant(){}
  public void assist(){
     System.out.println("I am assisting!");
  }
}

编译器: line:person.assist();在List类的addAssistant()方法中。

编译器错误: 编译器找不到符号 - 方法辅助()。

6 个答案:

答案 0 :(得分:8)

你需要一个明确的演员:

if(person instanceof Assistant){
  ((Assistant)person).assist();
}

但是,我认为通常不鼓励这种逻辑。

答案 1 :(得分:1)

您必须将Person投射到这样的Assistant

if(person instanceof Assistant){
  ((Assistant)person).assist();
}

这种类型的铸造能力表明了我认为有缺陷的应用设计。

只是旁注:

您应该使用接口而不是具体实现。所以你应该替换它:

private ArrayList<Person> persons;

用这个:

private List<Person> persons;

如果您希望Person做他们的具体工作而且Assistant的工作有助于您通过在Person

中创建抽象方法来解决这个问题
public abstract void doYourWork();

您可以在Assistant中实现它:

@Override
public void doYourWork(){
    // doing something
}

在这种情况下,您不必显式转换Person个对象。

如果Person没有任何具体的实现,你可以改为使用它。

答案 2 :(得分:1)

您需要进行强制转换才能使用子类方法

if(person instanceof Assistant){
  ((Assistant)person).assist();
}

答案 3 :(得分:1)

Person类没有定义辅助方法,所以你必须显式地转换为Assistant类,例如

if(person instanceof Assistant){
  ((Assistant)person).assist();
}

答案 4 :(得分:1)

我会这样编码

public void addAssistant(){
    Assistant assistant = new Assistant();
    assistant.add(person);
    assistant.assist();
}

从您最近创建的对象实际上是助手的知识中抽象自己是没有意义的。

从具体类型中提取自己是一种减少两段代码之间耦合的好方法,并且有必要做一些像多态这样的好东西...但在这个特定的例子中,你向我们展示你已经紧密耦合到一个助手(实际上你只是在上面两行实例化)。

实现此目的的另一种可能方法是使用多态,您可以通过将assist()方法添加到Person的接口来实现。

public class Person {
  public Person(){}

  public void assist() {
     //I'm a just a person who doesn't assist anywhere
  }
}

通过这样做,你将能够做你正在尝试的事情:

public void addAssistant(){
    Person person = new Assistant();
    persons.add(person);
    person.assist();     
}

但是我不建议这样做,主要是因为你将开始在你的Person界面填充那些没有正确放置的职责。这都是设计问题,您需要为您的特定问题选择更好(当然也是最舒适)的解决方案。

祝你好运 克劳迪奥

答案 5 :(得分:0)

Java语言的设计方式,这不会编译(因为你已经弄清楚了)。可以这样想,所有助手都是人,但不是所有人都是助手。如果你使用显式演员,你可以做你想要达到的目标(如他在答案中提到的NPE)。