2

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

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 中无法覆盖运算符。我怎么解决这个问题?

4

2 回答 2

2

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

您还可以使用诸如 等方法的自定义接口创建自己的类add()mul()由于这些是方法调用,因此您不能在此处使用本机类型,因此损失了很多性能,并且没有理由编写此类代码正如 Java 中的示例而不是 C++ 中的示例。一些库,例如Trove,实际上使用代码生成代替 Java 泛型来为一组参数化类获得类似 C++ 的预处理器样式的行为。

于 2012-05-15T12:13:30.033 回答
1

当你声明你的类时,你可以更具体地说明你接受什么类型。这意味着您可以指定类型参数必须是Number

public class Polynomial<T extends Number>

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

于 2012-05-15T12:12:31.303 回答