【问题标题】:Dynamically cast to yet unknown class in ArrayList of objects在对象的 ArrayList 中动态转换为未知类
【发布时间】:2015-04-28 21:50:35
【问题描述】:

我有一个 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)?

【问题讨论】:

  • 您不同的问题在功能上是否有所不同?
  • 您应该使用接口并将功能委托给适当的类

标签: java android arraylist casting


【解决方案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() ){

}

【讨论】:

  • 您必须强制转换为 (Question) 接口以使其正确 isAnswered() 调用。当我执行 if 语句时,我确实得到了 Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference。有什么避免它的提示吗?
  • 如果列表被参数化为类问题,则不需要强制转换。 java.lang.Object java.util.List.get(int)' on a null object reference 列表是否为空?
  • 糟糕,我将列表声明了两次:作为字段和在代码中。更改了字段中的类型,它就像一个魅力!
【解决方案2】:

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

A. 像这样在 ArrayList 上添加一个 typecaster 以及每个问题:

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()
    {
        // ..
    }
    // ...
}
// ..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多