Java 如何用相似但不同的对象填充列表?

Java 如何用相似但不同的对象填充列表?,java,class,inheritance,interface,Java,Class,Inheritance,Interface,我有两个类,比如“QuestionOne”和“QuestionsTwo”,它们非常相似,并且继承自基类“Question”。现在我想写一个方法,用任意一个类的对象填充ArrayList public ArrayList<QuestionOne> list = new ArrayList<QuestionOne>(); public void fill(QuestionOne questionOne){ list.add(questionOne); } public A

我有两个类,比如“QuestionOne”和“QuestionsTwo”,它们非常相似,并且继承自基类“Question”。现在我想写一个方法,用任意一个类的对象填充ArrayList

public ArrayList<QuestionOne> list = new ArrayList<QuestionOne>();

public void fill(QuestionOne questionOne){
list.add(questionOne);
}
public ArrayList list=new ArrayList();
公共空间填充(问题一问题一){
增加(问题一);
}
这将是一种填充QuestionOne对象的方法。但我希望该方法能够用“QuestionOne”和“QuestionTwo”两种类型的对象填充列表

我想补充的是……我想使用“问题一”和“问题二”的所有方法

我怎样才能做到这一点?我需要一个接口吗?我不知道…

制作一个
ArrayList
并以这种方式填充它。尽管您只有可用的接口,但问题类会公开该接口。

制作一个
ArrayList
并以这种方式填充它。虽然您只有可用的接口,但问题类会公开该接口

public ArrayList<Question> list = new ArrayList<Question>();
因此,您可以将属于
Question
子类的任何内容添加到列表中

注意:一些评论建议同时更改
fill
的参数。你可以这么做,但你不必这么做。这取决于你的要求。这仍然有效:

public void fill(QuestionOne questionOne){
    list.add(questionOne);
}
因为
问题一
是一个
问题
(也是一个
问题一
)。如果确实需要,您可以超载
填充

public void fill(QuestionOne questionOne){
    System.out.println("I'm adding a Type I question");
    list.add(questionOne);
}

public void fill(QuestionTwo questionTwo){
    if (questionTwo.isInteresting()) {
        // assume isInteresting is a method that is defined only for QuestionTwo
        System.out.println("I'm adding a Type II question");
        list.add(questionTwo);
    }
}
通常,最好通过向
QuestionOne
QuestionTwo
中覆盖的
QuestionOne
问题添加多态方法来执行类似操作。但这并不总是可能的。我提出这一点只是想指出,
fill
的参数实际上不需要更改,尽管您可能需要更改

因此,您可以将属于
Question
子类的任何内容添加到列表中

注意:一些评论建议同时更改
fill
的参数。你可以这么做,但你不必这么做。这取决于你的要求。这仍然有效:

public void fill(QuestionOne questionOne){
    list.add(questionOne);
}
因为
问题一
是一个
问题
(也是一个
问题一
)。如果确实需要,您可以超载
填充

public void fill(QuestionOne questionOne){
    System.out.println("I'm adding a Type I question");
    list.add(questionOne);
}

public void fill(QuestionTwo questionTwo){
    if (questionTwo.isInteresting()) {
        // assume isInteresting is a method that is defined only for QuestionTwo
        System.out.println("I'm adding a Type II question");
        list.add(questionTwo);
    }
}

通常,最好通过向
QuestionOne
QuestionTwo
中覆盖的
QuestionOne
问题添加多态方法来执行类似操作。但这并不总是可能的。我提出这一点只是想指出,
fill
的参数实际上不需要更改,尽管您可能想更改。

如果您使用抽象类
Question
,您将能够使用
Question
的数组列表来存储这两个子类对象

class Question{}
class QuestionOne extends Question{}
class QuestionTwo extends Question{}

ArrayList<Question> list = new ArrayList<Question>();

// This method will take any subclass of Question.
public void fill(Question question){
  list.add(question);
}

如果使用抽象类
Question
,则可以使用
Question
的数组列表来存储这两个子类对象

class Question{}
class QuestionOne extends Question{}
class QuestionTwo extends Question{}

ArrayList<Question> list = new ArrayList<Question>();

// This method will take any subclass of Question.
public void fill(Question question){
  list.add(question);
}

如前所述,您可以创建Question类型的ArrayList。这意味着您将只能使用问题类中定义的方法

比如说

public class Question {

    public void askAQuestion(){
        System.out.println("Im asking a question");
    }

}
_

_

_

public类MainClass{
公共静态void main(字符串[]args){
列出问题=新建ArrayList();
添加(新问题一());
添加(新问题2());
questions.get(0.askAQuestion();//输出“我在问第一个问题”
questions.get(1.askAQuestion();//输出“我在问第二个问题”
}
}

如前所述,您可以创建Question类型的ArrayList。这意味着您将只能使用问题类中定义的方法

比如说

public class Question {

    public void askAQuestion(){
        System.out.println("Im asking a question");
    }

}
_

_

_

public类MainClass{
公共静态void main(字符串[]args){
列出问题=新建ArrayList();
添加(新问题一());
添加(新问题2());
questions.get(0.askAQuestion();//输出“我在问第一个问题”
questions.get(1.askAQuestion();//输出“我在问第二个问题”
}
}

将代码中的
QuestionOne
替换为
QuestionOne
?这两个类之间的共同点是什么?一种方法是:ArrayList list=new ArrayList();您能否仅从基类调用方法,
Question
?或者您需要调用特定于每个类的方法吗?将代码中的
QuestionOne
替换为
Question
?这两个类之间的共同点是什么?一种方法是:ArrayList list=new arrarylist();您能否仅从基类调用方法,
Question
?还是需要调用特定于每个类的方法?这是一个大问题。现在我不能使用问题。get(0)。doSomethingElse()。但这正是我想要的你能解释一下问题一需要做什么问题二不需要吗?(反之亦然)谢谢请注意,通常情况下,instanceof关键字只能作为最后手段使用。重写方法通常是可预操作的。更多信息可以在网站上找到,这是一个大问题。现在我不能使用问题。get(0)。doSomethingElse()。但这正是我想要的你能解释一下问题一需要做什么问题二不需要吗?(反之亦然)谢谢请注意,通常情况下,instanceof关键字只能作为最后手段使用。重写方法通常是可预操作的。有关更多信息,请访问
public class MainClass {

    public static void main (String[] args){

        List<Question> questions = new ArrayList<Question>();
        questions.add(new QuestionOne());
        questions.add(new QuestionTwo());

        questions.get(0).askAQuestion(); // Outputs "Im asking question one"
        questions.get(1).askAQuestion(); // Outputs "Im asking question two"
    }

}