如何在Java中进行类型安全支付操作?



我是Java的新手,我尝试使用泛型进行类型安全的货币操作。
例如,有一个函数 add,我想确保我不能将美元添加到欧元,并且如果我添加美元,我将只得到美元。

在我的代码段中,我不知道如何从 BigDecimal 转换为 T 类型。
你能帮我解决这个问题吗,或者提出另一种设计。
提前致谢

package com.company;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
class Money extends BigDecimal{
public Money(int val) {
super(val);
}
}
class Euro extends Money {
public Euro(int val) {
super(val);
}
}
class Usd extends Money {
public Usd(int val) {
super(val);
}
}
class Operation{
public <T extends Money> T add(T a, T b){
return (T) a.add(b);
}
}
Operation operation = new Operation();
Usd usdResult = operation.add(new Usd(5), new Usd(5));
Euro euroResult = operation.add(new Euro(5), new Euro(5));
System.out.println(usdResult);
System.out.println(euroResult);
}
}

首先,我建议[组合而不是继承],因为BigDecimal方法返回BigDecimal实例,而不是Money,因此从中继承没有太大价值。您必须编写自己的add方法,无论哪种方式都返回Money...

接下来,为了实现类型安全,我建议将Money设为泛型,并使货币类型与Money无关。是的,它们"是一种"Money,但那样就不是类型安全的。Money.add会返回Money的实例,而不是Euro,所以Euro不能继承Money.add

这是它的外观:

class Money<T extends Currency> {
private BigDecimal value;
public Money(BigDecimal value) {
this.value = value;
}
public BigDecimal getValue() {
return value;
}
public Money<T> add(Money<T> other) {
return new Money<>(value.add(other.value));
}
// plus other operations...
}
interface Currency {}
final class Euro implements Currency { private Euro() {} }
final class Usd implements Currency { private Usd() {} }

由于泛型是固定的,因此无法向Money<Euro>添加Money<Usd>

最新更新