首页 > 解决方案 > [Ljava.lang.Object; 不能转换为 java.util.Collection

问题描述

我正在尝试将 Array_AGG 实现为 CombineFn,下面是我的代码:

    public static class ArrayAggArray extends Combine.CombineFn<Object, List<Object>, Object[]> {
    @Override
    public List<Object> createAccumulator() {
      return new ArrayList<>();
    }

    @Override
    public List<Object> addInput(List<Object> accum, Object input) {
      accum.add(input);
      return accum;
    }

    @Override
    public List<Object> mergeAccumulators(Iterable<List<Object>> accums) {
      List<Object> merged = new ArrayList<>();
      for (List<Object> accum : accums) {
        merged.add(accum);
      }
      return merged;
    }

    @Override
    public Object[] extractOutput(List<Object> accumulator) {
      return accumulator.toArray();
    }
  }

当我运行测试时,我得到了java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Collection

我怀疑我们无法创建 Iterable<List>。任何其他帮助/输入将不胜感激。

标签: javalistobjectarraylist

解决方案


您的代码中存在问题,您试图将 a 添加List<Object>为集合中的元素List<Object>,这就是您在此处出现错误的原因:

@Override
public List<Object> mergeAccumulators(Iterable<List<Object>> accums) {
    List<Object> merged = new ArrayList<>();
    for (List<Object> accum : accums) {
        merged.add(accum);
    }
    return merged;
}

merged对象的类型为,List<Object>但您accum的类型也List<Object>为,因此它不能将一个转换为另一个。

根据您想要做的事情,您必须accum对例如的元素进行另一个循环:

@Override
public List<Object> mergeAccumulators(Iterable<List<Object>> accums) {
    List<Object> merged = new ArrayList<>();
    for (List<Object> accum : accums) {
        for (Object o : accum) {
            merged.add(o);
        }
    }
    return merged;
}

或者您可以使用addAll或其他您希望它执行的方法。


推荐阅读