有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

这将是一种填充QuestionOne对象的方法。但我希望该方法能够用“QuestionOne”和“QuestionTwo”两种类型的对象填充列表

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

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


共 (4) 个答案

  1. # 1 楼答案

    如果使用抽象类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)将在xQuestionQuestion子类的任何对象时工作

    通常,每当您说变量或参数的类型为C时,它都可以包含对CC的任何子类的引用。这同样适用于ArrayList{}例程的参数,该例程如下所示:

    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添加多态方法来执行类似操作,该方法在QuestionOneQuestionTwo中被重写。但这并不总是可能的。我只是想指出,fill的参数实际上不需要更改,尽管您可能想更改

  3. # 3 楼答案

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

    比如说

    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"
        }
    
    }
    
  4. # 4 楼答案

    做一个ArrayList<Question>并按这种方式填充。虽然您只有可用的接口,但问题类会公开该接口