2015-03-08 148 views
0

我有一个List<Task> tasksToDo,它拥有许多不同的对象。其中一些不是Task对象,而是TimingTask对象,它是继承自Task类的类。我的问题是,当我尝试使用遍历这个列表如下:循环遍历继承的类对象列表

for(Task theTask: tasksToDo) 
{ 

} 

我如何使用的方法是一个TimingTask对象的内部,如果对象是那种类型的? TimingTask对象类型具有名为getAdd的方法,该方法仅存在于该类型中。因此,当我尝试使用theTask.getAdd时,出现getAdd方法在Task类类型中不存在的错误。

+6

一个可能的解决方案。如果你要正确对待'Task'对象,如'TimingTask'对象,此举'getAdd'成'Task'。 – Smutje 2015-03-08 20:24:53

+0

我同意@Smutje。见http://en.wikipedia.org/wiki/Liskov_substitution_principle – Elist 2015-03-08 20:34:31

回答

1

使用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 
    } 
} 
0
for(Task theTask: tasksToDo) 
{ 
    ((TimingTask)theTask).getAdd(); 
} 

如果你想先检查该theTask是TimingTask的一个实例,使用instanceof

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

它的坏的形式是一个数组迭代的基类对象,并试图把它们当作它们的派生类。一般你想迭代基类对象,因为你想把它们当作对象类型。放入特定于派生类的逻辑会使循环代码更难以维护。

+0

我明白这一点,但我没有看到处理这种情况的更好方法。如果我有不同的任务类型需要迭代,因为我不认为所有这些类型应该在一个类中。这只会让这个类混淆,而不是这个循环。 – 2015-03-08 20:33:10

+0

先前有关将该方法添加到替代方法的评论。但在你的情况下,似乎唯一真正的选择是检查实例。 – LhasaDad 2015-03-09 00:07:55

-1

疗法是你的问题

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 
     } 
    }