Lambda lamba表达式中的返回类型错误

Lambda lamba表达式中的返回类型错误,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我在给定代码中遇到以下编译错误- lamba表达式中的返回类型错误:Map可以 不能转换为Map{ hit.set(false); Map rawMap=Paser.parse(Map.class,key); Map dummymmap=newhashmap(); 对于(Map.Entry:rawMap.entrySet()){ dummyMap.put(entry.getKey(),entry.getValue()) .stream() .map(this::mapToParam) .coll

我在给定代码中遇到以下编译错误-

lamba表达式中的返回类型错误:Map>可以 不能转换为Map>

我根本不知道为什么会有这样的错误。因为mapToReturn和dummyMap属于同一类型

    Map<String, Set<Param>> mapToReturn = Optional.ofNullable(CACHE.get(content, (key) -> {
        hit.set(false);
        Map<String, List<Map<String, Object>>> rawMap = Paser.parse(Map.class, key);
        Map<String, Set<Param>>  dummyMap = new HashMap<>();

        for (Map.Entry<String, List<Map<String, Object>>> entry : rawMap.entrySet()) {
            dummyMap.put(entry.getKey(), entry.getValue()
                    .stream()
                    .map(this::mapToParam)
                    .collect(Collectors.toSet()));
        }

        return dummyMap;
    })).orElseThrow(() -> new ParamParserException("... "));
Map-mapToReturn=Optional.ofNullable(CACHE.get(content,(key)->{
hit.set(false);
Map rawMap=Paser.parse(Map.class,key);
Map dummymmap=newhashmap();
对于(Map.Entry:rawMap.entrySet()){
dummyMap.put(entry.getKey(),entry.getValue())
.stream()
.map(this::mapToParam)
.collect(Collectors.toSet());
}
返回dummyMap;
})).orelsetrow(()->新的paramParseRexException(“…”);

缓存的签名。get当然很重要,这就是您出现此错误的原因。我试图重现这个问题。考虑与你的问题有关的部分代码:

Map<String, Set<Param>> aMap = Optional.ofNullable(CACHE.get(content, (key) -> {
            //...
            Map<String, Set<Param>>  dummyMap = new HashMap<>();
            //...
            return dummyMap;
        })).orElseThrow(() -> new ParamParserException("... "));
现在让我们更改签名:

static class CACHE
{
   static Map<String, Set<Param>> get(String content, Function<String, Map<String, List<Map<String, Object>>>> func)
    {
         return ...;
    }
 }
静态类缓存
{
静态映射获取(字符串内容,函数func)
{
返回。。。;
}
}
此操作失败,出现以下错误:

lambda表达式
Map
中的返回类型不正确,无法删除 转换为
Map


这正是你得到的错误。
Paser.parse的签名不是原因,因为错误消息会有所不同。

Param
==
参数
?是。更正了。抱歉,这是一个输入错误,
CACHE.get
Paser.parse
的方法签名是什么,以及
内容的类型是什么?还有,你拼错了“Parser”。@Douglas。。CACHE.get和Parser.parse的签名实际上并不重要。我已经更改了代码以删除它们,我相当确定它们确实很重要,这也是您出现问题的原因。否则我就不会问了。请添加它们。如果您以证明我错的方式更改了本地代码,请发布新代码。我不确定
Parser.parse
是否无关。它可能涉及到一系列泛型推理。当然,
Parser.parse
是相关的。但是,如果其签名有问题,则错误消息将不同。OP引用的错误与lambda的返回类型有关,这意味着编译器抱怨
dummyMap
解析器。即使如此,parse
也可能是问题的一部分。我怀疑
CACHE.get
Parser.parse
都是泛型的,一般推断来自
rawMap
->解析器的推断签名的类型。解析
->key
->缓存的推断签名的推断类型。获取
->lambda->错误的推断预期返回类型,因为
dummymemap
不匹配。否则,lambda的推断返回类型与
rawMap
完全匹配似乎是一种巧合。
static class CACHE
{
   static Map<String, Set<Param>> get(String content, Function<String, Map<String, List<Map<String, Object>>>> func)
    {
         return ...;
    }
 }