这可能是非常明显的事情,但我真的在努力解决这个问题,任何帮助都会受到赞赏。
我正在尝试创建一个具有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方法)
谢谢!
答案 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
个实例(r
,c
和s
提供了不同的名称,因此您无法确定哪种活动它是。你可以这样做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();
}
}