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

Dynamically cast to yet unknown class in ArrayList of objects

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

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 项目,所以每个问题 class 已经继承了 Fragment)?

您可以让每个问题 class 实现一个 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() ){

}

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

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* class 有一个 属性 type 然后用一个 switch语句(如前所述)进行适当的类型转换,即:

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

C.让所有Question*class继承common Question superclass或者根据需要实现common接口,即:

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

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