是否可以在扩展Number的泛型方法中与零值进行比较?

时间:2014-01-04 00:59:44

标签: java generics comparable

我目前有一种方法可以在iterable中返回非零索引。我希望这种方法能够处理任何扩展java.lang.Number的类。当然,Number没有实现Comparable。但是我不想为Long,Integer等单独的方法。截至目前,这就是我所拥有的:

public static <T extends Number & Comparable<? super T>> nonZeroIndices(Iterable<T> iterable) {
    Set<Integer> nonzero_indices = Sets.newTreeSet();
    Iterator<T> iterator = iterable.iterator();
    int i = 0;
    while (iterator.hasNext()) {
        T t = iterator.next();
        if (t.doubleValue() != 0) // This is what is bothering me
            nonzero_indices.add(i);
        i++;
    }
    return nonzero_indices;
}

但我想避免doubleValue()。我还想避免在我的方法中进行一堆instanceOf次调用。我是否可以将此方法用于T T extends Number的{​​{1}}类型?

修改 使用T implements Comparable(如Sotirios所建议的)仍然需要一堆<T extends Number & Comparable<? super T>>语句,我想避免这些语句。我希望我可以安全地将零转换为instanceOf类型,但编译器会发出一条警告“未经检查的强制转换”。

更具体地说,我试过

T

但它会发出警告。

2 个答案:

答案 0 :(得分:3)

问题是Integer具体是Comparable<Integer>Double具体是Comparable<Double>,依此类推,所以要使用他们的compareTo,你必须传入适当类型的引用,这意味着您必须拥有适当类型的对象。请注意,(Double) new Integer(0)中的强制转换永远不会成功,因为您不能引用一种指向不兼容类型对象的类型。 (实际上这是一个编译错误,因为在这种情况下编译器可以告诉强制转换永远不会成功。)

我认为你的doubleValue方法可能是最好的方法。

答案 1 :(得分:2)

Number层次结构无法实现。您必须使用instanceof

一般情况下,您的doubleValue技巧似乎在大多数情况下都有效。我可以使用BigDecimal构建误报:

new BigDecimal("0.000..<repeats 380 times>..001").doubleValue() == 0

如果您遇到问题,可能需要为BigDecimal添加特殊情况。