当我尝试创建一个类的实例并将其添加到我的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()方法中。
编译器错误: 编译器找不到符号 - 方法辅助()。
答案 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)。