我正在用C ++学习Java中的泛型,并且很混淆如何在没有运算符重载的情况下进行数学运算。假设我想写一个sumList
类,它只是一个带有求和方法的列表。
public class sumList<T extends CanAdd<T>> {
private List<T> list;
public sumList() {
list = new List<T>();
}
public void addElement(T t) {
list.add(t);
}
public T getSum() {
T ans = null;
for (T t : list) {
if (ans == null) {
ans = t;
} else {
ans = ans.plus(t);
}
}
return ans;
}
}
我正在使用的界面就是:
public interface CanAdd<T>
{
// returns a new T that's the sum of the object + other
public T plus(T other);
}
因此,当我创建{I}创建的类sumList
,例如Vector
或Point
时,这很简单,因为我可以添加接口定义的plus方法。但是,如何更改sumList
以便我也可以创建sumList<Double>
或sumList<Integer>
?
编辑:修正了一些小错误。
答案 0 :(得分:3)
正如Kaleb所说,如果您只需要使用它来处理Java Numbers,那么您不必担心接口,只需使用T extends Number。
但是如果你真的想让它更通用并使用你的canAdd接口,那么你需要围绕Number对象编写一个包装类并使用它。
修改强>
也许你正在以错误的方式看待它。不要让填充列表的类具有特定的行为(在这种情况下是总和),而应该从函数式编程中借用一些有用的技巧。
您可以在Java中编写map,reduce和filter方法。你有一些样板来帮助你达到可以使用它们的程度,但是你可以轻松地为你想要求和的每种类型的对象创建一个reduce函数,然后将它应用到你的列表中。
答案 1 :(得分:0)
为什么不使用Double和Integer的基类,Number?
public class sumList<T extends Number>
这样,就不需要实现canAdd接口或创建包装器来使用该接口使用双打和整数。
编辑:但是如果你真的需要为自定义类做这个工作,我认为你必须创建一个提供必要的canAdd接口的包装类。
或者,使用像Scala或Groovy这样的语言,可以访问mixins!