在对象的 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()
{
// ..
}
// ...
}
// ..
我有一个对象类型的 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()
{
// ..
}
// ...
}
// ..