java - Number 操作的通用类

标签 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 类呢? 谢谢!

最佳答案

使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(); 
}

扩展特定类型的范围类:

class IntegerRange extends Range<Integer> {
     @Override
      public Integer length() {
          return v2 - v1;
      }
 }

这符合开闭原则。类应该对扩展开放,但对修改关闭。使用 instanceof 检查是违反此原则的最简单方法,因为 Range 需要针对其必须支持的每种新类型进行修改。在您的情况下应该避免这种情况。

关于java - Number 操作的通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940510/

相关文章:

java - 为什么我的泛型不采用子类?

C# 泛型运算符

java泛型遗留兼容性问题

java - 尝试在 Spring Boot 中配置从 Secret Manager 读取并抛出区域错误

java - Google API ClusterManager 自定义项目渲染

java - JUnit - 分享不同实现的测试

java - 以类型安全的方式编写类

java - 如何使用 php 显示来自 mySQL DB 的压缩 Blob 文件

scala - 如何为具有嵌套泛型类型的对象定义 JSON 格式?

C# Covariance puzzle,我遇到过