3 回答

TA贡献1811条经验 获得超5个赞
accept
方法在file.list
里面调用的,楼主可以打开File
类的源代码,很清楚的看到调用流程,下面是我从File
类里面复制出来的list
方法
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()]);
}

TA贡献1802条经验 获得超6个赞
回调的意思就是,你实现一个接口(不一定非得是接口),但不去调用这个接口,而是让定义这个接口的一方(这里应该指Java类库)去调用你给的实现。
list出满足要求的子目录这个操作,涉及若干步骤,有些是不变的(比如都需要首先得到当前目录下的所有子目录,没有看过源码,但应该是OS的系统调用),这些都实现在Java类库里的。与这个步骤对应的是变化的操作,也就是你要子目录满足什么条件。所以类库把变化的这部分设计成接口,让你去实现,你再通过File.list()
去注册你的回调。
因为你不调用,所以才叫回调呀 - don't call me, I'll call back
或者更直接一点,accept(File, String)
的调用发生在File.list(FilenameFilter)
函数内。在函数内,会将参数dir
和name
传递给你给的实现,也就是调用accept(File, String)
方法。
添加回答
举报