在ArrayList对象中动态转换为未知类

时间:2015-04-28 21:50:35

标签: java android arraylist casting

我有一个Object类型的ArrayList,它包含6个不同类的对象:

questions = new ArrayList<>();
questions.add(new Question1());
questions.add(new Question2());
questions.add(new Question3());
questions.add(new Question4());
questions.add(new Question5());

根据questionNum变量,我必须得到对象的方法,即来自ArrayList的isAnswered()。

我想要的例子:

for (int i = 0; i < 5; i++)
{
     questionNum = i;
     if ((Question<questionNum>)questions.get(questionNum).isAnswered())
     {
          Log.d("Answered", String.valueOf(questionNum));
     }
}

我现在正在使用的是:

else if (questionNum == 4 &&
((Question5)questions.get(questionNum)).isAnswered())

任何方式使它更优雅,或者我应该使用接口或继承(做Android项目,所以每个问题类已经继承了Fragment)?

2 个答案:

答案 0 :(得分:1)

您可以让每个Question类实现interface

public interface Question{
    public boolean isAnswered(); 
}

public class Question1 implements Question{
    public boolean isAnswered(){
        //implementation
    }
    //other code
}

然后将这些问题添加到列表中

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

然后您可以从列表中获取问题并调用适当的方法:

if ( questions.get(0).isAnswered() ){

}

答案 1 :(得分:0)

我在这里看到三个解决方案:

A。在ArrayList上添加一个类型转换程序以及每个问题,如下所示:

questions = new ArrayList<>();
questions.add(new ArrayList<>(Arrays.asList(new Question1(), "Question1")));
questions.add(new ArrayList<>(Arrays.asList(new Question2(), "Question2")));

然后有一个switch语句,具体取决于第二个类型参数和类型转换(字面意思)根据需要

B。让每个Question*类都有一个属性type,然后使用switch语句(如前所述)进行相应的类型转换,即:

class Question1
{
    public String type = "Question1";
    // ...
}
// ...

C。让所有Question*类继承自公共Question超类,或根据需要实现通用接口,即:

class Question
{
    public String type = "Question";
    public Boolean isAnswered()
    {
        return false;
    }
    // ...
}

class Question1 extends Question
{
    public String type = "Question1";
    public Boolean isAnswered()
    {
        // ..
    }
    // ...
}
// ..