gpt4 book ai didi

java - 流 API 收集方法编译器错误 - 无法将对象强制转换为列表

转载 作者:行者123 更新时间:2023-12-05 00:35:48 25 4
gpt4 key购买 nike

我看不出我的流 API 逻辑有什么问题。它告诉我以下内容

[ERROR] mystuff/MandantContentFetcher.java:[67,23] incompatible types: java.lang.Object cannot be converted to java.util.List

这是我的流方法:

static List<MandantLinkCheckerEntry> createMandantLinkCheckerEntries(Struct struct) {
Map<String, Object> linkCheckerMandants = struct.toNestedMaps();
return linkCheckerMandants.values().parallelStream()
.map(Map.class::cast)
.map(MandantLinkCheckerEntry::convertMapToMandantCheckerEntry)
.collect(Collectors.toList());
}

使用该方法引用:

  private static MandantLinkCheckerEntry convertMapToMandantCheckerEntry(Map<String, Object> entryToConvert) {
return new MandantLinkCheckerEntry(String.valueOf(entryToConvert.get("mandant.path")),
String.valueOf(entryToConvert.get("mail.to")),
Boolean.valueOf(String.valueOf(entryToConvert.get("active"))));
}

为什么他会看到一个对象?第二个ma​​p 中的方法引用确实返回了一个MandantLinkCheckerEntry。另外我假设 collect 确实创建了一个 List ,其中流式值作为泛型类型,但似乎他转换了流的类型(这里是 Object ,因为 Stream 发起者是 Map<String, Object )。我怎样才能帮助他将其转换到列表中?

最佳答案

问题是,类字面量不能引用泛型,所以 Map.class计算结果为 Class<Map> ,与原始类型 Map 关联,这就是您调用 cast 时得到的信息就可以了。

所以后面的.map(MandantLinkCheckerEntry::convertMapToMandantCheckerEntry)带有未检查的操作,分配 MapMap<String, Object>这会导致编译器在此表达式完全没有泛型的情况下继续运行,最终调用 .collect(Collectors.toList());在原始类型 Stream其删除返回是Object .

当你使用

static List<MandantLinkCheckerEntry> createMandantLinkCheckerEntries(Struct struct) {
Map<String, Object> linkCheckerMandants = struct.toNestedMaps();
return linkCheckerMandants.values().parallelStream()
.map(Map.class::cast)
.map((Function<Map,MandantLinkCheckerEntry>)MandantLinkCheckerEntry::convertMapToMandantCheckerEntry)
.collect(Collectors.toList());
}

相反,未检查的操作发生在绑定(bind)方法convertMapToMandantCheckerEntry 时。至Function<Map, MandantLinkCheckerEntry> ,但不与周围的 map方法调用,所以流链编译不会出错。

你总是不可避免地在某处有一个未经检查的操作,因为从 Object 转换的正确性至Map<String, Object>不能在运行时检查。最干净的解决方案是 struct.toNestedMaps()返回 Map<String, Map<String, Object>>首先:

static List<MandantLinkCheckerEntry> createMandantLinkCheckerEntries(Struct struct) {
Map<String, Map<String, Object>> linkCheckerMandants = struct.toNestedMaps();
return linkCheckerMandants.values().parallelStream()
.map(MandantLinkCheckerEntry::convertMapToMandantCheckerEntry)
.collect(Collectors.toList());
}

关于java - 流 API 收集方法编译器错误 - 无法将对象强制转换为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45087025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com