public float sum(Object ob) {
float sum = 0;
for (int i = 0; i < ob.length; i++) {
sum += ob[i];
}
return sum;
}
如何实现一个能返回任何类型的所有数组元素之和的函数?
答案 0 :(得分:2)
一个有根据的猜测,我有一段时间没有做过java。是按顺序演员吗?
编辑或者,将参数类型更改为float[]
:
float[] ob = (float[]) ob;
public float sum(Object ob) {
float sum = 0;
float[] ob = (float[]) ob;
for (int i = 0; i < ob.length; i++) {
sum += ob[i];
}
return sum;
}
答案 1 :(得分:2)
你要做的是......基本上......实施一个糟糕的设计。 Java中的基元数组不是类型兼容的,你不能以多态方式对它们做任何事情。
目前尚不清楚修复设计的最佳方法是什么。但这里有几个选择:
为每个有意义的案例编写重载方法; e.g。
public int sum(int[] ints) ...
public long sum(long[] longs) ...
public float sum(float[] floats) ...
然后确保在编译时已知类型的原始数组上调用它们。
将数组包装在类中,并为每个数组实现sum
方法:
public interface NumberArray {
double sum();
...
}
public class FloatArray {
private float[] floats;
public Float(float[] floats) { this.floats = floats; }
public double sum() {
double sum = 0.0D;
for (float f : floats) { sum += f; }
return sum;
}
}
依此类推。
实际上可以实现float sum(Object array)
方法......就像这样:
public float sum(Object obj) {
float sum = 0;
if (obj instanceof float[]) {
for (float f : (float[]) obj) {
sum += f;
}
} else if (obj instanceof int[]) {
for (int i : (int[]) obj) {
sum += i;
}
} else if ...
} else {
throw new SomeException("Can't sum one of these ...");
}
return sum;
}
但那不是OO和(IMO)真的很难看。更好地修复设计。
答案 2 :(得分:1)
根据对其他答案的评论:
java.lang.ClassCastException:[J无法强制转换为[F
然后是long[]
,而不是float[]
。只需使用long
,而不是float
或Object
。如果你明确地将它声明为方法参数,那么你也不需要摆弄强制转换。
public long sum(long[] array) {
long sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}