当前位置: 首页 > 知识库问答 >
问题:

Stream API收集方法编译器错误-对象不能强制转换到列表

宗政颖逸
2023-03-14

我看不出我的流api逻辑有什么问题

[错误]mystuff/MandantContentFetcher。java:[67,23]不兼容的类型:java。无法将lang.Object转换为java。util。列表

这是我的stream方法:

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"))));
  }

他为什么看到一个物体?第二个映射中的方法引用确实返回MandantLinkCheckerEntry。我还假设collect确实创建了一个列表,其中流值是泛型类型,但他似乎转换了流的类型(这是对象,因为流启动器是Map)


共有2个答案

应志用
2023-03-14

更改此行:

.map(Map.class::cast)

对于这个:

.map(o -> (Map<String, Object>) o)

当然,这种强制转换是完全不安全的,并且会生成警告,但至少,您将沿着流管道保留泛型类型参数。

印子平
2023-03-14

问题是,类的文字不能引用泛型类型,所以Map.class计算为

所以接下来的。map(MandantLinkCheckerEntry::convertmaptomandatcheckerentry)带有一个未选中的操作,将映射分配给映射

当你使用

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());
}

相反,当将方法转换MapToMandantCheckerEntry绑定到函数时,会发生未检查的操作

你总会不可避免地在某个地方有一个未经检查的操作,比如从对象映射的转换的正确性

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

 类似资料: