Kotlin抱怨尽管lambda匹配了签名,但类型不正确

Kotlin抱怨尽管lambda匹配了签名,但类型不正确,kotlin,lambda,Kotlin,Lambda,我有一些代码,根据IntelliJ的检查,它期望(可变)列表中的函数,但提供了(列表)->Int。据我所知,后者是前者的有效签名 有关守则: val longest = HashMap<String, List<String>>() .apply { this["aal"] = listOf("ala", "aal", "laa")

我有一些代码,根据IntelliJ的检查,它期望(可变)列表中的
函数<!,out Int!>,但提供了
(列表)->Int
。据我所知,后者是前者的有效签名

有关守则:

val longest = HashMap<String, List<String>>()
        .apply {
            this["aal"] = listOf("ala", "aal", "laa")
            this["eilv"] = listOf("evil", "live")
            this["aaa"] = listOf("aaa", "aaa", "aaa")
        }
        .values
        .stream()
        .collect(groupingBy({ list: List<String> -> list.size },
                Supplier { TreeMap<Int, List<List<String>>>() },
                toList()))
        .lastEntry()
        .value
但是,当我更改此选项时:

 .collect(groupingBy({ list: List<String> -> list.size },
          Supplier { TreeMap<Int, List<List<String>>>() },
          toList()))
.collect(分组依据({list:list->list.size}),
供应商{TreeMap()},
toList())
为此:

.collect(groupingBy({ list: List<String> -> list.size },
         { TreeMap<Int, List<List<String>>>() },
         toList()))
.collect(分组依据({list:list->list.size}),
{TreeMap()},
toList())

解决了这个问题。为什么呢?为什么指定
Supplier
名称会以错误消息抱怨映射功能的方式改变行为?

这是Kotlin当前提供的实现细节:它看到
groupingBy
有两个SAM类型的参数(
函数
供应商
)并创建一个合成方法,用Kotlin函数类型替换它们。因此,您只能传递两个Kotlin函数(如上一个示例所示)或一个
函数
和一个
供应商

.collect(groupingBy(Function { list: List<String> -> list.size },
    Supplier { TreeMap<Int, List<List<String>>>() },
    toList()))
.collect(分组依据(函数{list:list->list.size}),
供应商{TreeMap()},
toList())
(可能需要导入
java.util.function.function
并可能指定类型参数)

.collect(groupingBy(Function { list: List<String> -> list.size },
    Supplier { TreeMap<Int, List<List<String>>>() },
    toList()))