可实例化的匿名Java Intefrace:它可能还是我错了?

时间:2013-07-04 22:42:35

标签: java interface anonymous-class

在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中有效的接口?

我问这个的原因是因为我认为接口不是可实例化的(因为接口没有构造函数),而且对于使用接口,你必须通过类实现该接口。那么我们在没有通过类实现的情况下实例化接口的可能性如何呢?

有人可以帮助我在逻辑中找到错误吗?

1 个答案:

答案 0 :(得分:4)

您没有实例化接口。您正在实例化一个匿名类,它实现了该接口。

假设上面发布的代码在文件Foo.java中,那么编译器会看到以下输出:

  1. Foo.class
  2. Foo$1.class
  3. 其中Foo.class显然是已编译的Foo类,Foo$1.class是您在代码中使用的已编译的匿名类。

    您可以在Java Language Specification, Chapter 15.9.5. Anonymous Class Declarations

    中找到具体内容