Kotlin调用contains报类型推断失败T未在输入类型中提及错误
错误原因说明
这个报错本质是参数类型和集合元素类型不匹配触发的泛型推断异常,具体逻辑如下:
- 你的变量
x类型为Map<String, Set<String>>,因此x.values返回的是元素类型为Set<String>的集合,它的contains方法期望传入的参数类型和集合元素类型一致,也就是Set<String>。 - 你传入的参数
stcd是String类型,和期望的Set<String>类型完全不匹配。 - 之所以没有直接提示「类型不匹配」,是因为Kotlin为了兼容Java中
Collection.contains(Object o)的宽松签名,对contains方法做了泛型适配,当传入参数类型和集合元素类型无法统一时,编译器无法推导泛型参数T的具体类型,就会抛出你看到的类型推断失败错误。
额外问题&修正方式
- 逻辑错误:你当前的写法是在「存着Set的集合」里找有没有等于stcd的Set,和你实际想要的「判断map中任意一个Set类型的value里包含stcd字符串」的逻辑完全不符。正确的判断逻辑应该是:
x.values.any { it.contains(stcd) }
- 冗余声明:你在遍历map时把value声明为可空类型
Set<String>?,但前面aaa的类型已经明确Map的value是非空的Set<String>,这个可空声明是多余的;且遍历过程中你没有使用value变量,可以直接用_忽略。 - 冗余调用:Kotlin集合自带一套函数式操作API,不需要额外调用Java Stream的
stream()方法,直接在列表上调用filter、forEach即可,可读性和执行效率都更好。
修正后的完整代码参考:
fun a(stcd: String) { val res = mutableSetOf<String>() val aaa = mutableListOf<Map<String, Set<String>>>() aaa.filter { it.isNotEmpty() } .filter { x -> x.values.any { it.contains(stcd) } }.forEach { x -> x.forEach { (k, _) -> res.add(k) } } }
内容的提问来源于stack exchange,提问作者Criwran
相关产品推荐
相关产品推荐

