java - [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>。任何其他帮助/输入将不胜感激。
解决方案
您的代码中存在问题,您试图将 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
或其他您希望它执行的方法。
推荐阅读
- java - Drools - 规则数量和永久空间之间是否存在直接关联?
- javascript - 如何在threejs/tween.js中让对象一步一步移动
- python-3.x - 将值从另一列数据框更新到另一个数据框
- javascript - Javascript - 邮件
- python - mutliindex dask 数据帧到 2d dask 数组
- dialogflow-es - Dialogflow v2 api - 触发带有与输入上下文冲突的事件的意图
- scikit-learn - max_df 和 min_df 限制是在停用词删除之后还是之前应用并在 CountVectorizer 中查找二元组
- android - 如何在嵌套导航控制器片段之间传递事件/数据
- sql - SQL 确定员工是否回答了客户问题
- javascript - 打字稿错误:类型 {...} 上不存在属性“日志”-Console.log()