Java使用正确对象的方法

时间:2013-11-12 15:21:10

标签: java arrays

这可能是非常明显的事情,但我真的在努力解决这个问题,任何帮助都会受到赞赏。

我正在尝试创建一个具有Activity类的程序,该类是Run Swim Cycle类的超类,还有另一个名为member的类。

成员有一个名为diary的arraylist,用于记录成员的距离

 private ArrayList<Activity>diary = new ArrayList<>();

活动的添加方式如下:

 public void addActivity(Activity a){
    diary.add(a);

 }

现在我需要将每个类的距离放到一个数组中,并显示每种活动所涵盖的正确距离,我试着这样做:

public double[] getTotalDistances(){
   double distance[];
   distance = new double[3];


    for (Activity r: diary){
           distance[0] += r.getDistance(); 
    }
    for(Activity c: diary ){
           distance[1] += c.getDistance(); 
    }

    for(Activity s: diary ){
           distance[2] += s.getDistance(); 
    }

    for(int i = 0; i < distance.length; i++){
        System.out.println(distance[i]);

    }




    return distance;
   }

但是如果我这样做,这只返回超类的getDistance()方法:

for (Run r: diary){
           distance[0] += r.getDistance(); 
    }

然后java抱怨那些是不兼容的类型:

incompatible types. required: run, found: activity.

如果run是activity的子类,那为什么会抱怨不兼容? 以及如何使用正确的方法(&#34;运行&#34;类中的getDistance方法)

谢谢!

2 个答案:

答案 0 :(得分:2)

您已将列表diary键入为ArrayList<Activity>,这意味着它包含Activity类型的元素。然后,您要求Java通过假设列表包含Run项而不进行迭代。这是因为列表可以包含Activity的任何子类,并且假设一个子列没有意义。所以你真的做不到:

for(Activity activity : diary) {
   ...
}

现在在以下三个循环中:

for (Activity r: diary){
       distance[0] += r.getDistance(); 
}

for(Activity c: diary ){
       distance[1] += c.getDistance(); 
}

for(Activity s: diary ){
       distance[2] += s.getDistance(); 
}

你正在进行三次相同的计算!您所做的一切都为Activity个实例(rcs提供了不同的名称,因此您无法确定哪种活动它是。你可以这样做instanceof检查:

for (Activity activity : diary){
    if (activity instanceof Run) {
        distance[0] += activity.getDistance(); 
    } else if (activity instanceof Cycle) {
        distance[1] += activity.getDistance();
    } else if (activity instanceof Swim) {
        distance[2] += activity.getDistance();
    }
}

这可行,但不是很优雅。而是让对象告诉你它是什么类型。创建一个名为enum的{​​{1}},让您的抽象ActivityType类有一个名为Activity的方法:

getActivityType

然后每个子类都会实现此方法并返回正确的类型:

public abstract class Activity {    
    ...
    ...

    public abstract ActivityType getActivityType();
}

等等。

然后在你的循环中,你只需要这样做:

public class Run extends Activity {
    ...
    ...

    @Override
    public ActivityType getActivityType() {
        return ActivityType.RUN;
    }
}

答案 1 :(得分:0)

你不能这样做继承。运行时不会过滤掉run

中非run s内的所有内容diary

您应该使用instanceof运算符

执行以下操作
for (Activity r: diary){
    if(r instanceof Run){
        distance[0] += r.getDistance(); 
    }
}