我正在编写一个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类? 谢谢!
答案 0 :(得分:2)
将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();
}
extend
特定类型的范围类:
class IntegerRange extends Range<Integer> {
@Override
public Integer length() {
return v2 - v1;
}
}
这符合open-closed
原则。一个类应该是可以扩展的,但是关闭以进行修改。使用instanceof
检查是违反此原则的最简单方法,因为需要为每个必须支持的新类型修改Range
。在你的情况下应该避免这种情况。