使用Kotlin特殊变量`it`时Lambda表达式类型推断失败问题
问题解答
首先明确File.listFiles()有两个关键重载:
- 接受
FileFilter接口:该接口的accept方法仅接收一个File类型参数,返回布尔值 - 接受
FilenameFilter接口:该接口的accept方法接收两个参数(File类型的目录、String类型的文件名),返回布尔值
第一种代码能编译的原因
directory.listFiles { it -> it.name.startsWith("abc") }
这里显式声明了lambda的单个参数it,编译器会自动匹配参数数量对应的重载——也就是单参数的FileFilter。此时it的类型被推断为File,调用it.name自然合法。
第二种代码编译失败的原因
directory.listFiles { it.name.startsWith("abc") }
当省略参数声明直接用it时,编译器无法确定你要匹配哪个重载:
- 它既可以被理解为单参数的
FileFilter(it对应File对象) - 也可以被理解为双参数的
FilenameFilter(it对应第一个参数File目录,第二个参数被忽略)
这种歧义导致编译器无法完成类型推断,因此编译报错。
关于你的推断逻辑
你提到的“通过name属性推断it类型”并不准确。第一种情况是先通过lambda的参数数量匹配到FileFilter重载,从而确定it是File类型,之后才能合法调用name属性——顺序是先确定参数类型,再验证属性调用,而非反过来。
内容的提问来源于stack exchange,提问作者Thomas Hirsch
相关产品推荐
相关产品推荐

