Kotlin 将Lamda函数传递给泛型函数不起作用

Kotlin 将Lamda函数传递给泛型函数不起作用,kotlin,Kotlin,我正在玩Kotlin,我正在尝试将一个工作的Scala代码转换为Kotlin。一切似乎都很顺利,但编译器给了我这个错误,我不知道如何处理它 类型不匹配:推断类型为Any,但此行应为ExQuestion:返回makeMap(questions,add2) 我使用的是泛型函数,因为我需要在构建映射时访问类型a的成员,这些成员将通过提供的lambda函数可见 以下是可以复制到Kotlin沙箱中的代码: data class ExQuestion(val area: String, val rId: S

我正在玩Kotlin,我正在尝试将一个工作的Scala代码转换为Kotlin。一切似乎都很顺利,但编译器给了我这个错误,我不知道如何处理它

类型不匹配:推断类型为Any,但此行应为ExQuestion:返回makeMap(questions,add2)

我使用的是泛型函数,因为我需要在构建映射时访问类型a的成员,这些成员将通过提供的lambda函数可见

以下是可以复制到Kotlin沙箱中的代码:

data class ExQuestion(val area: String, val rId: String, val text: String, val rIdAnswer: String, val line: Long)

fun main() {
    
    fun <A> makeMap(list: List<A>, addValue: (A, MutableMap<String, A>) -> Unit): Map<String, A> {
        val map = mutableMapOf<String, A>()

        for( item in list) {
            addValue(item, map)
        }
        return map
    }

    val add2: (ExQuestion, MutableMap<String, ExQuestion>) -> Unit =
            { question: ExQuestion, map: MutableMap<String, ExQuestion> ->

                val key = question.rId
                if (map[key] == null) {
                    map[key] = question
                } else {
                    println("Id Frage mehrfach vorhanden - " + key)
                }
            }
            
            val questions = listOf(ExQuestion("Area", "Q01", "text", "A01",1))

        return makeMap(questions, add2)
}
数据类ExQuestion(val区域:String,val rId:String,val文本:String,val rIdAnswer:String,val行:Long)
主要内容(){
有趣的makeMap(list:list,addValue:(A,MutableMap)->单位):Map{
val map=mutableMapOf()
用于(列表中的项目){
附加值(项目、地图)
}
返回图
}
val add2:(ExQuestion,可变地图)->单位=
{问题:ExQuestion,映射:可变映射->
val key=question.rId
if(映射[键]==null){
地图[钥匙]=问题
}否则{
println(“Id Frage mehrfach vorhanden-”+键)
}
}
val问题=列表(ExQuestion(“区域”、“Q01”、“文本”、“A01”、1))
返回makeMap(问题,添加2)
}
工作代码:

data class ExQuestion(val area: String, val rId: String, val text: String, val rIdAnswer: String, val line: Long)

fun main() {
    
    fun <A> makeMap(list: List<A>, addValue: (A, MutableMap<String, A>) -> Unit): Map<String, A> {
        val map = mutableMapOf<String, A>()

        for( item in list) {
            addValue(item, map)
        }
        return map
    }

    val add2: (ExQuestion, MutableMap<String, ExQuestion>) -> Unit =
            { question: ExQuestion, map: MutableMap<String, ExQuestion> ->

                val key = question.rId
                if (map[key] == null) {
                    map[key] = question
                } else {
                    println("Id Frage mehrfach vorhanden - " + key)
                }
            }
            
            val questions = listOf(ExQuestion("Area", "Q01", "text", "A01",1))

    val map = makeMap(questions, add2)
    println(map.values)
}
数据类ExQuestion(val区域:String,val rId:String,val文本:String,val rIdAnswer:String,val行:Long)
主要内容(){
有趣的makeMap(list:list,addValue:(A,MutableMap)->单位):Map{
val map=mutableMapOf()
用于(列表中的项目){
附加值(项目、地图)
}
返回图
}
val add2:(ExQuestion,可变地图)->单位=
{问题:ExQuestion,映射:可变映射->
val key=question.rId
if(映射[键]==null){
地图[钥匙]=问题
}否则{
println(“Id Frage mehrfach vorhanden-”+键)
}
}
val问题=列表(ExQuestion(“区域”、“Q01”、“文本”、“A01”、1))
val map=makeMap(问题,添加2)
println(映射值)
}

我不确定您的问题是什么,但您可以通过执行以下操作将
问题列表
转换为键入
rId
的地图:

val map = questions.map { it.rId to it }.toMap()
println(map)
结果:

{Q01=ExQuestion(area=Area, rId=Q01, text=text, rIdAnswer=A01, line=1)}

根据评论更新

您可以通过执行以下操作来实现这一点,而无需可变映射:

val map = questions
    .groupBy { it.rId }
    .mapValues { (key, values) ->
        if (values.size > 1) println("Id Frage mehrfach vorhanden - $key")
        values.first()
    }

然而,我认为您的可变映射解决方案很好,可以说更清晰,因此这只是为了演示。

当您尝试返回
map
时,您
main()
函数返回单位,谢谢!仍然在我的“真实”代码中得到错误,必须进一步研究它。我已经添加了工作代码。问题是什么?问题是导致此错误的原因,如文本->类型不匹配:推断类型为Any,但此行预期为ExQuestion:return makeMap(questions,add2)Daniel已对错误做出响应,但使用单行解决方案,我不需要带lamda的泛型函数。实际上,我重新发明了地图功能:-)谢谢!因为我想标记重复项,所以我想出了这个解决方案:val map=mutableMapOf()questions.forEach{question->val key=question.rId if(map[key]=null){map[key]=question}else{println(“Id Frage mehrfach vorhanden-”+key)}}要删除重复项还是只记录重复项?我记录重复项,但将第一个值保留在映射中。确定。我在答案中添加了另一个例子,但听起来你已经知道了。如果问题解决了,请接受答案✓