我目前有一种方法可以在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
但它会发出警告。
答案 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
添加特殊情况。