任何类型的元素总和

时间:2011-03-19 05:55:57

标签: java

public float sum(Object ob) {
    float sum = 0;
    for (int i = 0; i < ob.length; i++) {
        sum += ob[i];
    }

    return sum;
}

如何实现一个能返回任何类型的所有数组元素之和的函数?

3 个答案:

答案 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,而不是floatObject。如果你明确地将它声明为方法参数,那么你也不需要摆弄强制转换。

public long sum(long[] array) {
    long sum = 0;
    for (int i = 0; i < array.length; i++) {
        sum += array[i];
    }
    return sum;
}

另见: