【问题标题】:Iterate over List of inherited class objects迭代继承的类对象列表
【发布时间】:2015-03-08 20:21:20
【问题描述】:

我有一个List<Task> tasksToDo,其中包含许多不同的对象。其中一些不是Task 对象,而是TimingTaskobjects,这是一个从Task 类继承的类。我的问题是,当我尝试使用以下内容迭代此列表时:

for(Task theTask: tasksToDo)
{

}

如果对象属于该类型,我如何使用 TimingTask 对象内部的方法? TimingTask 对象类型有一个名为 getAdd 的方法,它只存在于该类型中。因此,当我尝试使用theTask.getAdd 时,我收到一个错误,因为getAdd 方法不在Task 类类型中。

【问题讨论】:

标签: java loops inheritance


【解决方案1】:

遍历基类对象数组并试图将它们视为派生类是一种糟糕的形式。通常,您希望遍历基类对象,因为您希望将它们视为该对象类型。放入特定于派生类的逻辑会使循环代码更难以维护。

【讨论】:

  • 我明白这一点,但是我看不到更好的方法来处理这种情况。如果我有不同的任务类型需要迭代,因为我不相信所有这些类型都应该在一个类中。那只会使该类混淆而不是这个循环
  • 先前关于将方法添加到替代方案的评论。但在你的情况下,似乎唯一真正的选择是 instanceof 检查。
【解决方案2】:

使用instanceof:

for(Task theTask: tasksToDo) {

    if (theTask instanceof TimingTask) { //if theTask is an istance of the class TimingTask
        TimingTask theTimingTask = (TimingTask)theTask;
        //now you can use theTimingTask.getAdd();
    } else {
        //theTask is not an instance of the class TimingTask
    }
}

【讨论】:

    【解决方案3】:
    for(Task theTask: tasksToDo)
    {
      ((TimingTask)theTask).getAdd();
    }
    

    如果要先检查 theTask 是 TimingTask 的实例,请使用instanceof

    if(theTask instanceof TimingTask)
        ((TimingTask)theTask).getAdd();
    

    【讨论】:

      【解决方案4】:

      您的问题有一个可能的解决方案

      for(Task theTask: tasksToDo){
             if (theTask instanceof TimingTask){
                TimingTask theTimingTask = (TimingTask)theTask;
                //Your treatments for your theTimingTask objects
             }else{
                //If you need other treatments for only the Task objects and your other different objects
             }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多