有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

迭代器Java,谷歌收藏库;AbstractIterator有问题吗?

我正在使用Google Collections库AbstractIterator实现一个生成器。我这样做时遇到了一个问题;我把它简化为一个更基本的类型,并重现了这个问题。对于它所做的事情来说,这种减少显然是过度的,通过一个Iterable从1计算到numelements

本质上,在下面的代码中,未注释的版本有效,而注释的版本无效(最后提供一个null元素,而不是以最后一个数字结尾)

是我做错了什么,还是图书馆出了问题

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进行比较),但没有效果。我四处寻找了一些关于这方面的文档,但什么也没找到。显然,?:语法只是一种方便,不是必需的,但仍然


共 (2) 个答案

  1. # 1 楼答案

    由于使用了三元运算符(条件表达式)和不同的数值类型,因此会得到一个NullPointerException。Java在三元表达式中混合不同类型的数值时有复杂的规则:^{}

    假定endOfData()在前面返回Integer,而localcountint,Java将endOfData()的值解装箱。但是,假定endOfData()返回空值,取消装箱操作将导致空指针异常

    您可以继续使用if语句,或者将localcount声明为Integer

  2. # 2 楼答案

    我想问题在于您使用后增量运算符,以及三元运算符。因为这两个片段应该是完全等效的——如果它们不是抽象迭代器的错,那就很难说是抽象迭代器的错,因为此时没有调用它的任何代码