匿名类如何实现两个(或更多)接口(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)。您需要一个命名类来做到这一点。但是,匿名内部类和命名类都不能扩展多个类。