listFiles 的方法引用

sea*_*sea 5 java lambda java-8

我曾经从一本关于方法引用的书中读到以下代码。

File[] hiddenFiles = new File(".").listFiles(File::isHidden)
Run Code Online (Sandbox Code Playgroud)

当我从 File API 查找该listFiles方法时,我看到它只有以下方法:

listFiles(FileFilter filter)

listFiles(FilenameFilter filter)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过代码并且它有效。但是,虽然 API 声明它接受FileFilterFilenameFilter,但为什么代码可以工作?

我对 File::isHidden 的理解是它等价于以下 lambdas:

(File file) -> file.isHidden()
Run Code Online (Sandbox Code Playgroud)

但在 FileFilter 中,需要指定的方法如下。

boolean accept(File pathname)
Run Code Online (Sandbox Code Playgroud)

那么不应该在那里定义一个名为 accept 的方法,例如:

File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
 public boolean accept(File file) {
   return file.isHidden();
 }
});
Run Code Online (Sandbox Code Playgroud)

或者编译器可以以某种方式自动检测模式并将代码视为 FileFilter,尽管未定义方法“accept”并且未创建 FileFilter 对象?