按使用 Spliterator 实例类型错误生成的块处理列表

问题描述 投票:0回答:1

在这个程序中,有一个类型错误,我似乎无法修复。该程序是由 ChatGPT 生成的,他生成的所有其他实现都是正确的。错过了什么?

public class Main {
public static void main(String[] args) {

// Create a stream of integers from 1 to 10
IntStream stream = IntStream.range(1, 11);

// Process the stream in chunks of size 3 using a spliterator
int chunkSize = 3;
List<List<Integer>> chunks =
    StreamSupport.stream(
            new Spliterator<Integer>() {
              private final Spliterator<Integer> spliterator = stream.spliterator();
              private final List<Integer> chunk = new ArrayList<>(chunkSize);

              @Override
              public boolean tryAdvance(Consumer<? super Integer> action) {
                if (chunk.size() == chunkSize) {
                  action.accept(new ArrayList<>(chunk));    // TypeError
                  chunk.clear();
                  return true;
                }
                if (spliterator.tryAdvance(
                    elem -> {
                      chunk.add(elem);
                      if (chunk.size() == chunkSize) {
                        action.accept(new ArrayList<>(chunk));  // TypeError
                        chunk.clear();
                      }
                    })) {
                  if (!chunk.isEmpty()) {
                    action.accept(new ArrayList<>(chunk));    // TypeError
                    chunk.clear();
                  }
                  return true;
                }
                return false;
              }

              @Override
              public Spliterator<Integer> trySplit() {
                return null;
              }

              @Override
              public long estimateSize() {
                return spliterator.estimateSize();
              }

              @Override
              public int characteristics() {
                return spliterator.characteristics();
              }
            },
            false)
        .toList();

// Print the chunks
for (List<Integer> chunk : chunks) {
  System.out.println(chunk);
}

}

java java-stream spliterator
1个回答
1
投票

Consumer<? super Integer> action
期望接受
Integer
类型的对象,但您正在提供
List<Integer>
类型的对象。

这不可能编译:

Consumer<? super Integer> action = // ...
action.accept(new ArrayList<Integer>());

这可以:

Consumer<? super ArrayList<Integer>> action = // ...
action.accept(new ArrayList<Integer>());
© www.soinside.com 2019 - 2024. All rights reserved.