【问题标题】:Compare Comparable number of different types to zero比较不同类型的可比数量为零
【发布时间】:2019-08-02 17:22:28
【问题描述】:

我有这样的代码:

    BigDecimal n1= BigDecimal.TEN;
    Long n2= 15L;

    nullOrNonPositive(n1);
    nullOrNonPositive(n2);

及方法代码:

    private boolean nullOrNonPositive(Comparable value) {
        return isNull(value) || value.compareTo(BigDecimal.ZERO) <= 0;
    }

我确实得到了一个ExceptionLong 无法与BigDecimal 进行比较,这很明显。有没有办法使方法通用并将Comparable(它始终是一个数字(但不同的类))与零进行比较?

【问题讨论】:

  • 为什么要将 any 与 BigDecimal 进行比较?它们不是同一类型。
  • 为什么不使用 Number 而不是 Comparable 并强制转换为 double 并检查

标签: java generics numbers


【解决方案1】:

我将获取一个参数,该参数表示 Comparator 表示的类型的 zero 值,并让调用者传递它。

private static <T> boolean nullOrNonPositive(Comparable<T> value, T zero) {
    return isNull(value) || value.compareTo(zero) <= 0;
}

称之为

nullOrNonPositive(n1, BigDecimal.ZERO); //false
nullOrNonPositive(n2, 0L); //false

nullOrNonPositive(-1L, 0L); //true
nullOrNonPositive(2, 0)); //true

nullOrNonPositive("1", "0"); //false
nullOrNonPositive("0", "0"); //true

如果可能的类型集 (T) 有限,​​您可以将零值存储在映射中。

【讨论】:

    【解决方案2】:

    基于 user7 的answer,如果您不想传递零值,您可以添加调用 main 函数的方法。这使调用者不必知道每种类型的 zero 值是什么。

    private static <T> boolean nullOrNonPositive(Comparable<T> value, T zero) {
      return isNull(value) || value.compareTo(zero) <= 0;    
    }
    
    private boolean nullOrNonPositive(BigDecimal value) {
      return nullOrNonPositive(value, BigDecimal.ZERO)
    }
    
    private boolean nullOrNonPositive(Long value) {
      return nullOrNonPositive(value, 0L);
    }
    

    【讨论】:

    • 没关系,我以为您首先调用了您的顶级方法,但方向错误。
    • @Nexevis 它使调用者不必知道每种类型的zero 是什么。我不确定您所说的“重载所有这些并单独传递”是什么意思
    • @Beteaux 我说的正是你所做的,我只是第一次读错了。是我的错。
    【解决方案3】:

    或者,如果您不想为每个数字定义 0,并且您总是使用 nullOrNonPositive 来表示数字,您可以这样做:

    private boolean nullOrNonPositive(Number value) {
        return isNull(value) || new BigDecimal(value.toString()).signum() <= 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多