通用平均 - 需要通用类型但是有一个int

时间:2014-10-19 09:22:12

标签: java arrays generics math arraylist

我试图实现一个抽象的通用平均类。它必须有一个具体的平均方法。如何解决除法问题,将元素数(总是一个整数)除以数组或数组列表的总和?我在这里使用数组。使用数组列表具有相同的问题。看来我必须提供数组大小,但我真的不应该这样做。

编辑:通用平均类应该只有三种方法,其中E是泛型类型:E add(E f,E s); E除(E f,E s);和E setToZero()。应该有一个具有E average(E []数组)签名的具体类。数字必须表示为类的对象,如Integer和Double,而不是基元int和double。我认为这改变了问题的主旨。感谢你目前的帮助。我很欣赏这个论坛。 END_EDIT

考虑到上述情况,下面的代码编译但不是必需的。我相信我已经完成了尽职调查而没有成功。

EDIT2:我的客户(Java讲师)说他把int作为第二个参数很好,并且在向类添加另一个方法时没有问题。我认为这个问题没有得到很好的定义,因为这个问题过于严格,而且并非有意。

public abstract class GenericAverage<E>
{
    private E sum;
    private E average;

    public GenericAverage()
    {
        sum     = setToZero();
        average = setToZero();
    }

    public E Average(E[] array, E size) // wrong, it must be "E Average(E[] array)"
    {
        //E thisSize = 0; // which of course won't work
        for (int i = 0; i < array.length; i++) // to get that array length as an E      {
            sum = add(sum, array[i]);
            //thisSize = thisSize + 1; //which will not work
        }
        average = divide(sum, size);
        //average = divide(sum, getSize(array));  // maybe this is the answer I seek?  
        return average;
    }

    public abstract E add(E f, E s);
    public abstract E divide(E f, E s);
    public abstract E setToZero();
    //public abstract E getSize(E[] f);  // maybe this is the way to the answer?
}

2 个答案:

答案 0 :(得分:2)

嗯,这适用于Integer,Long,Float和Double。

public abstract class AbstractAverage<E> {

    private E sum;
    private E average;

    public AbstractAverage() {
        sum = setToZero();
        average = setToZero();
    }

    public E average(E[] array) {
        for (int i = 0; i < array.length; i++) {
            sum = add(sum, array[i]);
        }
        average = divide(sum, array.length);
        return average;
    }

    public abstract E add(E f, E s);
    public abstract E divide(E f, int s);
    public abstract E setToZero();
}

如果您绝对希望除法的第二个参数是E类型,那么将通用E的类类型存储在构造函数中并将变量转换为它。然而,这是丑陋的,并没有实现任何目标。

然而,正如评论中所建议的那样,这种divide方法可能是合理的。

public abstract E divide(E f, Number s);

答案 1 :(得分:0)

有人建议使用array.length并更改divide的签名,以便为第二个参数设置int

如果divide采用E类型的参数很重要,请考虑添加方法

public abstract E fromInt(int f);

并使用它将长度转换为E

该方法也可以替换setToZero(),或者至少在默认实现中使用。


为了代码重用,请考虑将add()divide()等移动到单独的类Calculator<E>。然后,Calculator的实例将在创建时提供给GenericAverage

您甚至可能希望将average()移至Calculator班级。

相关问题