Java泛型,在列表中添加所有整数/向量

时间:2012-03-24 01:15:30

标签: java generics

我正在用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,例如VectorPoint时,这很简单,因为我可以添加接口定义的plus方法。但是,如何更改sumList以便我也可以创建sumList<Double>sumList<Integer>

编辑:修正了一些小错误。

2 个答案:

答案 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!