Number上操作的通用类

时间:2015-04-29 10:06:07

标签: java generics

我正在编写一个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类? 谢谢!

1 个答案:

答案 0 :(得分:2)

Rangelength()抽象化。另请注意,v1v2应受到保护。

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。在你的情况下应该避免这种情况。