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

时间:2014-05-13 23:44:21

标签: java class inheritance interface

我有两个类可以说“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方法。

我怎样才能做到这一点?我需要一个界面吗?我不知道......

4 个答案:

答案 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,就可以包含对CC的任何子类的引用。这同样适用于ArrayList add例程的参数,如下所示:

boolean add(Question e) 

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

P.S。:有些评论建议更改fill的参数。你可以这样做,但你不必这样做。这取决于您的要求。这仍然有效:

public void fill(QuestionOne questionOne){
    list.add(questionOne);
}

因为questionOneQuestion(以及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);
    }
}

通常最好通过在QuestionQuestionOne中重写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"
    }

}