我有两个类可以说“QuestionOne”和“QuestionsTwo”非常相似,并且继承自Baseclass“Question”。现在我想编写一个方法,用任何类的对象填充ArrayList。
public ArrayList<QuestionOne> list = new ArrayList<QuestionOne>();
public void fill(QuestionOne questionOne){
list.add(questionOne);
}
这将是填充QuestionOne对象的方法。但我希望该方法能够使用“QuestionOne”和“QuestionTwo”这两种对象填充列表。
我想补充一点......我想使用“questionOne”和“questionTwo”的alle方法。
我怎样才能做到这一点?我需要一个界面吗?我不知道......
答案 0 :(得分:6)
制作ArrayList<Question>
并以此方式填写。虽然您只有可用的接口,但是Question类会公开。
答案 1 :(得分:3)
如果使用抽象类Question
,则可以使用Question
的arraylist来存储两个子类对象。
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);
}
要进行后投,您可以使用instanceof
进行比较:
{ //...
for(final Question element:list){
if(element instanceof QuestionOne){
QuestionOne question=(QuestionOne)element;
// Use it here.
}
//...
}
}
答案 2 :(得分:2)
public ArrayList<Question> list = new ArrayList<Question>();
只要list.add(x)
是x
或Question
的子类的任何对象,Question
就会生效。
通常,只要您说变量或参数的类型为C
,就可以包含对C
或C
的任何子类的引用。这同样适用于ArrayList
add
例程的参数,如下所示:
boolean add(Question e)
因此,您可以将任何属于Question
的子类的内容添加到列表中。
P.S。:有些评论建议更改fill
的参数。你可以这样做,但你不必这样做。这取决于您的要求。这仍然有效:
public void fill(QuestionOne questionOne){
list.add(questionOne);
}
因为questionOne
是Question
(以及QuestionOne
)。如果你真的需要,你可以重载fill
:
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);
}
}
通常最好通过在Question
和QuestionOne
中重写QuestionTwo
的多态方法来做这样的事情。但这并不总是可行的。我只是提出这一点,指出fill
的参数实际上并不需要改变,尽管你可能想要这样做。
答案 3 :(得分:1)
如上所述,您可以创建一个Question类型的ArrayList。这意味着您只能使用Question类中定义的方法。
例如
public class Question {
public void askAQuestion(){
System.out.println("Im asking a question");
}
}
_
public class QuestionOne extends Question {
@Override
public void askAQuestion(){
// You can override a method. As long as it has the same name and
// return type, it can have it's own functionality
System.out.println("Im asking question one");
}
public void doSomethingElse(){
// Because this method is not in the Question class, you cannot use
// it in your ArrayList
}
}
_
public class QuestionTwo {
@Override
public void askAQuestion(){
System.out.println("Im asking question two");
}
}
_
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"
}
}