我正在尝试理解与匿名类相关的参数。我在书中看到的例子要么没有论据,要么没有很好的解释。以下是代码(来自Java的简明的第二版示例5-8,是的,我知道它很旧:-)……
import java.io.*;
//Print out all the *.java files in the directory.
public static void main(String[] args)
{
File f = new File(args[0]);
String[] list = f.list(new FilenameFilter() {
public boolean accept(File f, String s) {
return s.endsWith(".java");
}
});
for (int i = 0; i < list.length; i++)
System.out.println(list[i]);
}
} 我的问题是如何将文件名f应用于'accept‘的'File f’参数,以及'String s‘参数从何而来?为什么会调用'accept‘方法,可能是从FilenameFilter构造函数调用的?
谢谢!
发布于 2011-08-03 07:28:45
如果您查看java api的源文件,您将在File.java中找到以下内容:
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}它调用给定文件名过滤器的accept方法。字符串s在您的示例names[i]中。list()返回一个字符串数组,该字符串数组命名由文件路径名表示的目录中的文件和目录。
要解释您的代码:
String[] list = f.list(new FilenameFilter() {
public boolean accept(File f, String s) {
return s.endsWith(".java");
}
}); 使用带有accept方法实现的FilenameFilter接口的新匿名类调用File类的list方法(请参见上文)。
发布于 2011-08-03 07:19:23
不幸的巧合。这两个f彼此无关:accept的参数独立于方法中的局部变量,也与局部变量无关。
代码令人困惑。应该是这样的:
File f = new File(args[0]);
String[] list = f.list(new FilenameFilter() {
public boolean accept(File file, String s) {
return s.endsWith(".java");
}
}); 从File.list方法内部调用FilenameFilter的accept方法。
发布于 2011-08-03 07:19:33
当list方法在您传递给它的FilenameFilter匿名类的实例上调用accept()时,这两个参数都是由它提供的。
原始流程:
在f.
list()通过使用两个参数调用其accept方法来检查每个文件是否符合给定的筛选器(您的匿名类)文件(文件f)及其名称(字符串s)accept()实现决定是否应接受此文件。https://stackoverflow.com/questions/6919856
复制相似问题