使用'it'特殊变量时,Kotlinlambda中的类型推断失败

46qrfjad  于 2023-01-26  发布在  Kotlin
关注(0)|答案(1)|浏览(121)

我不明白,为什么下面的编译:

directory.listFiles { it -> it.name.startsWith("abc") }

但这不是

directory.listFiles { it.name.startsWith("abc") }

在第一个例子中,it的类型是通过name属性推断出来的,我的假设是否正确?为什么在第二个例子中没有发生这种情况?

falq053o

falq053o1#

这是因为有两种可能的FunctionalInterfaces可以与File.listFiles一起使用:

  1. listFiles(FileFilter)-此接口为accept(File pathname)
  2. listFiles(FilenameFilter)-此接口为accept​(File dir, String name)
    编译器无法计算出您要使用哪一个,那么在您编写it ->的情况下,这有什么更好的呢?
    编译器检查两个接口方法的调用参数,现在可以看到您需要一个参数“SOMETHING ->”,因此唯一匹配的调用是FileFilter变体。
    如何使用FilenameFilter?您可以使用以下语法:
directory.listFiles { dir, name -> name.startsWith("abc") }

这里的神奇之处不在于it--这是一个巧合,而在于您只声明了一个参数。

相关问题