【问题标题】:Autoboxing 0 to Generic Number自动装箱 0 到通用编号
【发布时间】:2015-06-03 09:08:34
【问题描述】:

也许我的突触有一个结……

  public static <T extends Number> T firstNonZero(T... values) {
    for (T value : values) {
      if (value.doubleValue() != 0.0) {
        return value;
      }
    }
    return (T) 0;      // Cannot cast from int to T
  }

我想我不需要解释上面的方法。我的问题是我需要“生成”T 类型的零。

我该怎么做?

【问题讨论】:

  • return Integer.class.cast(0)
  • 如果找不到非零值,而不是零,甚至引发异常,难道不应该一个名为firstNonZero 的方法真的返回null 吗?
  • 不能返回null,那是没有意义的。

标签: java generics numbers autoboxing


【解决方案1】:

嗯,怎么样:

  public static <T extends Number> T firstNonZero(T... values) {
    T zero = null;
    for (T value : values) {
      if (value.doubleValue() != 0.0) {
        return value;
      } else {
        zero = value;
      }
    }
    return zero;
  }

这是假设至少有一个值被传递给方法。

【讨论】:

    【解决方案2】:

    这个怎么样:

    public static <T extends Number> T firstNonZero(T... values) {
            for (T value : values) {
              if (value.doubleValue() != 0.0) {
                return value;
              }
            }
            return (T)Integer.class.cast(0);      // Double class can do too but give 0.0 if double or we will have ClassCastException
          }
    

    在这种情况下也可以使用 0 个数字参数

    【讨论】:

    • 我认为这行不通。试试double d = firstNonZero(0.0); 如果你把它改成Double.class.cast,试试int d = firstNonZero(0);
    • @tobias_k 不,它不会因为 double d = firstNonZero(0.0); 而失败正如我刚刚尝试的那样,关于您关于 Double.class.cast 的第二个查询,我更新了答案 cmets ' Double class can also do but give 0.0 if double'
    • 失败:assertEquals(new Long(0), NumberUtilities.firstNonZero(0L));
    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多