我正在使用 Google Collections 库 AbstractIterator实现一个生成器。我在做的过程中遇到了一个问题;我已将其简化为更基本的类型并重现了该问题。对于通过 Iterable 从 1 计数到 numelements 的作用来说,这种减少显然是多余的。
本质上,在下面的代码中,未注释的版本有效,而注释的版本则无效(最后提供一个空元素,而不是以最后一个数字结尾)。
我做错了什么,还是库有问题?
private Iterable<Integer> elementGenerator(final int numelements) {
return new Iterable<Integer>() {
@Override public Iterator<Integer> iterator() {
return new AbstractIterator<Integer>(){
int localcount=0;
@Override protected Integer computeNext() {
if (localcount++ == numelements) return endOfData();
return localcount;
// return (localcount++ == numelements) ? endOfData() : localcount;
}
};
}
};
}
我还尝试摆弄 ?:
安排(例如,为返回添加前缀并与 +1 进行比较),但无济于事。我四处寻找有关此的文档,但没有找到任何内容。显然, ?:
语法只是一种方便,不是必需的,但仍然......
最佳答案
由于使用了具有不同数值类型的三元运算符、条件表达式,您会得到一个 NullPointerException
。 Java在三元表达式中混合不同类型的数值时有复杂的规则:JLS Section 15.25
.
鉴于 endOfData()
被认为返回 Integer
,而 localcount
是 int
,Java 取消装箱endOfData()
的值。但是,鉴于 endOfData()
返回 null,拆箱操作会导致空指针异常。
您可以继续使用 if 语句,或将 localcount 声明为 Integer
。
关于Java、谷歌集合库; AbstractIterator 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1821510/