我试图实现一个抽象的通用平均类。它必须有一个具体的平均方法。如何解决除法问题,将元素数(总是一个整数)除以数组或数组列表的总和?我在这里使用数组。使用数组列表具有相同的问题。看来我必须提供数组大小,但我真的不应该这样做。
编辑:通用平均类应该只有三种方法,其中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?
}
答案 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
班级。