Java 如何用相似但不同的对象填充列表?
我有两个类,比如“QuestionOne”和“QuestionsTwo”,它们非常相似,并且继承自基类“Question”。现在我想写一个方法,用任意一个类的对象填充ArrayListJava 如何用相似但不同的对象填充列表?,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
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"
}
}