在Java7 API参考(Java API 7)中,list()
类的函数File
具有签名:
public String[] list(FilenameFilter filter)
其中 FilenameFilter
是一个界面。假设在程序中使用此函数如下所示:
String[] list = new File(directory).list(new FilenameFilter() {
@Override
public boolean accept(File f, String s)
{
return s.endsWith(".java");
}
});
正如您所看到的,我们是匿名实例化接口。
如果我错了,请更正我,但是实例化一个在Java中有效的接口?
我问这个的原因是因为我认为接口不是可实例化的(因为接口没有构造函数),而且对于使用接口,你必须通过类实现该接口。那么我们在没有通过类实现的情况下实例化接口的可能性如何呢?
有人可以帮助我在逻辑中找到错误吗?
答案 0 :(得分:4)
您没有实例化接口。您正在实例化一个匿名类,它实现了该接口。
假设上面发布的代码在文件Foo.java
中,那么编译器会看到以下输出:
Foo.class
Foo$1.class
其中Foo.class
显然是已编译的Foo
类,Foo$1.class
是您在代码中使用的已编译的匿名类。
您可以在Java Language Specification, Chapter 15.9.5. Anonymous Class Declarations
中找到具体内容