我正在编写一个 Java 类来表示一个范围。我想让它更通用,以便范围可以是任何数字类型,但两个值 v1 和 v2 必须是相同的数字类型。
虽然我可以对它们进行比较,但我无法添加或减去这些值。我知道对两种不同数字类型的操作会导致问题(例如 Float + Integer),Number 的子类也会导致问题,例如BigInteger 和 BigDecimal。但就我而言,v1 和 v2 应该是同一类型。
class Range<T extends Number & Comparable<T>> {
public T v1;
public T v2;
public Range(T v1, T v2) {
if (v1.compareTo(v2) > 0)
throw new IllegalArgumentException("Value-1 must be smaller or equal to Value-2.");
this.v1 = v1;
this.v2 = v2;
}
public T length() {
return v2 - v1; // Compilation error
}
}
最近我才想到这样的想法:
public T add(T t1, T t2) {
if (t1 instanceof Integer) {
// ...
}
if (t1 instanceof Long) {
// ...
}
}
但是有没有更好的设计来创建 Range 类呢? 谢谢!
最佳答案
使Range
和length()
抽象。另请注意,v1
和 v2
应受到保护。
abstract class Range<T extends Number & Comparable<T>> {
protected T v1;
protected T v2;
public Range(T v1, T v2) {
if (v1.compareTo(v2) > 0)
throw new IllegalArgumentException("Value-1 must be smaller or equal to Value-2.");
this.v1 = v1;
this.v2 = v2;
}
public abstract T length();
}
扩展
特定类型的范围类:
class IntegerRange extends Range<Integer> {
@Override
public Integer length() {
return v2 - v1;
}
}
这符合开闭
原则。类应该对扩展开放,但对修改关闭。使用 instanceof
检查是违反此原则的最简单方法,因为 Range
需要针对其必须支持的每种新类型进行修改。在您的情况下应该避免这种情况。
关于java - Number 操作的通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940510/