gpt4 book ai didi

java - 如何实现参数化运算

转载 作者:行者123 更新时间:2023-12-02 04:06:36 24 4
gpt4 key购买 nike

我正在设计一个库,它提供了大量的类集合,这些类可以执行大量的数字运算。我不想将库的用户限制为单一数字类型,例如 int , double ,或BigDecimal - 因此,如果我可以使用泛型来允许用户选择自己的数字类型,那就太好了。我可以接受使用基元包装类而不是基元本身带来的开销,这是使用泛型所必需的,但我的问题在于执行算术。

如果我创建一个假设的类 MathematicalObject<N extends Number> ,那么用户可以使用任何类型来存储扩展 Number - Integer 的数字。 , Double , BigDecimal等等。然而Number类不提供任何算术接口(interface) - 我无法添加两个 Number s 而不将它们转换为 double或类似的东西 - 这可能会损害数字的准确性(例如,如果使用BigDecimal)。

那么,实现数字的参数化使用以允许我执行算术的最高效方法是什么?

最佳答案

您可以使用工厂来创建 MathematicalObject。 MathematicalObject 的构造函数可以接受专门用于为该参数化类型执行数学运算的策略类,并且工厂只是根据参数化类型选择正确的策略类。

public class MathemeaticalObject<N extends Number> {
private final NumberOperations<N> ops;
public MatchematicalObject(NumberOperations<N> ops) {
this.ops = ops;
}

public N myComplexOperation(N other) {
return ops.add(this, other);
}
}

public class MathematicalObjectFactory {
MathematicalObject<Integer> integerObject() {
return new MathematicalObject(new IntegerOperations());
}
....
}

public interface NumberOperations<N extends Number> {
N add(N other);
}

public class IntegerOperations implements NumberOperations<Integer> {
@Override
public Integer add(Integer first, Integer second) {
return first + second;
}
}

缺点是您仅限于支持的 N 值。但我认为可能没有办法解决这个问题。鉴于原始数学运算无法直接使用,它还可能会产生一些困惑的代码。

关于java - 如何实现参数化运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com