代码之家  ›  专栏  ›  技术社区  ›  Carl

Java,谷歌集合库;AbstractIterator问题?

  •  2
  • Carl  · 技术社区  · 15 年前

    我正在使用谷歌收藏库 AbstractIterator 实现一个发生器。我在做这个的时候遇到了一个问题;我把它简化成了一个更基本的类型,并复制了这个问题。这种减少显然是过度杀伤力,从1到numElements通过一个iterable计算。

    基本上,在下面的代码中,未注释的版本可以工作,注释的版本不能工作(最后提供一个空元素,而不是最后一个数字结尾)。

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

    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 回复  |  直到 15 年前
        1
  •  5
  •   notnoop    15 年前

    你得到一个 NullPointerException 由于使用了三元运算符、条件表达式,具有不同的数值类型。Java在三值表达式中混合不同类型的数值时具有复杂的规则: JLS Section 15.25 .

    鉴于 endOfData() 被要求返回 Integer ,同时 localcount 是一个 int ,Java解开了 EndoFoDATA() . 然而,鉴于此 EndoFoDATA() 返回空值,取消装箱操作将导致空指针异常。

    您可以继续使用if语句,也可以将localcount声明为 整数 .

        2
  •  0
  •   Andrzej Doyle    15 年前

    我认为问题在于您使用了后增量运算符以及三元运算符。因为从这一点出发,这两个片段应该是完全等效的——如果它们不是当时调用的代码,那么抽象迭代器的错误就很难了。