我有一个包含如下代码的类,其中我希望使用任何表示数字的类/类型都很简单。我发现自己定义了大量的方法,如下所示:
public class Range {
private BigDecimal inferior = new BigDecimal(0);
private BigDecimal superior = new BigDecimal(1);
public Range(BigDecimal inferior, BigDecimal superior) {
if (inferior.compareTo(superior) == -1) {
this.inferior = inferior;
this.superior = superior;
}
}
public Range(int inferior, int superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
public Range(Integer inferior, Integer superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
public Range(float inferior, float superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
public Range(double inferior, double superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
}我甚至还没有写出所有可能的组合!例如,它接受一个浮点数和一个双精度数,或者一个整型和一个BigDecimal。
如何才能以一种干净的方式实现这一点,以便存在对已经预定义的多个类/数据类型有效的参数,甚至是原语?我考虑过适配器和代理,但我经常发现自己不理解这些解释,我不知道它们是否适合我的用例,如果是的话,这个问题可能已经得到了回答,但如果是的话,我至少想看看是否有人可以根据这个特定的例子向我解释它。
发布于 2019-09-24 06:42:55
使用类Number
public Range(Number inferior, Number superior)Integer, Long, Double -它们都是Number的子类。
或者,使用泛型:
public class Range<T> {
private T inferior;
private T superior;
public Range(T inferior, T superior) {
this.inferior = inferior;
this.superior = superior;
}
}用法:
Range<Long> rangeLong = new Range<>(0L, 1000000000L);
Range<Double> rangeDouble= new Range<>(0d, 457.129d);发布于 2019-09-25 02:57:45
来自BigDecimal(String)的文档
这通常是将
float或double转换为BigDecimal的首选方法,因为它不会受到BigDecimal(double)构造函数不可预测性的影响。
接受Number,使用String.valueOf转换为字符串,然后传递给BigDecimal
public class Range {
private BigDecimal inferior;
private BigDecimal superior;
public Range(Number inferior, Number superior) {
this.inferior = new BigDecimal(String.valueOf(inferior));
this.superior = new BigDecimal(String.valueOf(superior));
}
}将自动支持任何扩展Number的类,包括您引入的新类型。
https://stackoverflow.com/questions/58070970
复制相似问题