gpt4 book ai didi

Java使用正确对象的方法

转载 作者:行者123 更新时间:2023-12-02 06:32:46 24 4
gpt4 key购买 nike

这可能是非常明显的事情,但我真的正在努力解决这个问题,任何帮助将不胜感激。

我正在尝试制作一个具有 Activity 类的程序,该类是 Run Swim Cycle 的父类(super class)code>classes,还有一个类叫member。

成员有一个名为 diary 的数组列表,用于记录成员所经过的距离

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

Activity 添加方式如下:

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

}

现在我需要将每个类的距离放入数组中并显示每种类型的 Activity 所覆盖的正确距离,我尝试这样做:

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

但是这仅返回父类(super class)的 getDistance() 方法,如果我这样做:

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

然后 java 提示这些类型不兼容:

incompatible types. required: run, found: activity.

如果 run 是 Activity 的子类,那么为什么它会提示不兼容?以及如何让它使用正确的方法(“run”类中的 getDistance 方法)工作

谢谢!

最佳答案

您已经输入了列表diaryArrayList<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 ),因此您无法弄清楚它是什么类型的 Activity 。你可以这样做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();
}
}

这可以工作,但不是很优雅。相反,让对象告诉您它是什么类型。创建 enumActivityType并有您的摘要Activity类有一个名为 getActivityType 的方法:

public abstract class Activity {    
...
...

public abstract ActivityType getActivityType();
}

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

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

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

等等。

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

for (Activity activity : diary){
if (activity.getActivityType() == ActivityType.RUN) {
distance[0] += activity.getDistance();
} else if (activity.getActivityType() == ActivityType.CYCLE) {
distance[1] += activity.getDistance();
} else if (activity.getActivityType() == ActivityType.SWIM) {
distance[2] += activity.getDistance();
}
}

关于Java使用正确对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com