如何在Java中对通用类型进行计算?

时间:2012-05-15 12:03:58

标签: java generics

我正在实现具有广义类型的多项式系数的多项式类。我有这段代码:

public class Polynomial<T> {

private HashMap<Integer, T > polynomial;

public Polynomial(T coefficient, Integer index) {
    polynomial = new HashMap<Integer, T>();
    if (coefficient!=0) 
        polynomial.put(index, coefficient);
}

public void sum(Polynomial<T> w) {
    for (Map.Entry<Integer, T> e : w.polynomial.entrySet()) {
        T tmp = polynomial.get(e.getKey());
        if(tmp==null)
            polynomial.put(e.getKey(), e.getValue());
        else {
            polynomial.remove(e.getKey());
            if (tmp+e.getValue()!=0)
                polynomial.put(e.getKey(), tmp+e.getValue());
        }
    }
}

...

}

由于显而易见的原因无法编译。运算符:==,!=,+, - 和*没有为通用类型T定义。据我所知,在Java中我无法覆盖运算符。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

由于Java中的泛型与C ++中的泛型不同,因此不能使用运算符。您需要确保类型T实现某些接口并使用接口的方法进行计算。假设你使用了标准库中的Number接口,它允许你在你的对象上调用doubleValue()并根据它来计算,你可以使用像private HashMap<Integer, T extends Number >这样的定义,在这种情况下你将能够从T。

访问Number的方法

您也可以使用add()mul()等方法基于自定义界面创建自己的类。由于这些是方法调用,因此您不能在此使用本机类型,性能丢失,并且没有理由编写代码,例如Java中的示例而不是C ++。有些库,比如Trove,实际上使用代码生成代替Java Generics来获得C ++ - 就像一组参数化类的预处理器样式行为。

答案 1 :(得分:1)

您可以更加具体地了解您在宣布课程时接受的类型。这意味着您可以指定type参数必须是Number

public class Polynomial<T extends Number>

然后,您可以使用Number类(intValue()doubleValue()等)中的方法将其转换为基元,并对其进行算术运算。我知道,这不是理想的,但是如果你使用doubleValue()并且你的数字不是太大,那么应该可行。