匿名类如何实现两个(或更多)接口(interface)?或者,如何扩展类来实现接口(interface)?
例如,我要创建一个扩展两个接口(interface)的匿名类对象:

    // Java 10 "var" is used since I don't know how to specify its type
    var lazilyInitializedFileNameSupplier = (new Supplier<String> implements AutoCloseable)() {
        private String generatedFileName;
        @Override
        public String get() { // Generate file only once
            if (generatedFileName == null) {
              generatedFileName = generateFile();
            }
            return generatedFileName;
        }
        @Override
        public void close() throws Exception { // Clean up
            if (generatedFileName != null) {
              // Delete the file if it was generated
              generatedFileName = null;
            }
        }
    };
然后,我可以将它作为zit_code和惰性初始化的实用程序类一起在try-with-resources块中使用:
        try (lazilyInitializedFileNameSupplier) {
            // Some complex logic that might or might not
            // invoke the code that creates the file
            if (checkIfNeedToProcessFile()) {
                doSomething(lazilyInitializedFileNameSupplier.get());
            }
            if (checkIfStillNeedFile()) {
                doSomethingElse(lazilyInitializedFileNameSupplier.get());
            }
        }
        // By now we are sure that even if the file was generated, it doesn't exist anymore
我不想创建一个内部类,因为我绝对确定除了需要使用它的方法之外,不会在任何地方使用该类(而且我可能还想使用在该方法中声明的局部变量属于AutoCloseable类型)。

最佳答案

匿名类必须扩展或实现某些东西,就像其他任何Java类一样,即使它只是java.lang.Object

例如:

Runnable r = new Runnable() {
   public void run() { ... }
};

在这里,r是实现Runnable的匿名类的对象。

匿名类可以使用相同的语法扩展另一个类:
SomeClass x = new SomeClass() {
   ...
};

您无法实现的是实现多个接口(interface)。您需要一个命名类来做到这一点。但是,匿名内部类和命名类都不能扩展多个类。

10-05 21:50