Java 匿名类的多重继承
匿名类如何实现两个(或更多)接口?或者,它如何既扩展类又实现接口? 例如,我想创建一个匿名类的对象,它扩展了两个接口:Java 匿名类的多重继承,java,multiple-inheritance,anonymous-class,Java,Multiple Inheritance,Anonymous Class,匿名类如何实现两个(或更多)接口?或者,它如何既扩展类又实现接口? 例如,我想创建一个匿名类的对象,它扩展了两个接口: //使用Java 10“var”,因为我不知道如何指定它的类型 var LAZLYInitializedFileNamesSupplier=(新供应商实现自动关闭)(){ 私有字符串生成的文件名; @凌驾 公共字符串get(){//只生成一次文件 if(generatedFileName==null){ generatedFileName=generateFile(); } 返
//使用Java 10“var”,因为我不知道如何指定它的类型
var LAZLYInitializedFileNamesSupplier=(新供应商实现自动关闭)(){
私有字符串生成的文件名;
@凌驾
公共字符串get(){//只生成一次文件
if(generatedFileName==null){
generatedFileName=generateFile();
}
返回generatedFileName;
}
@凌驾
public void close()引发异常{//Clean up
if(generatedFileName!=null){
//删除已生成的文件
generatedFileName=null;
}
}
};
然后我可以在try with resources块中使用它作为AutoCloseable
作为延迟初始化的实用程序类:
try(lazylinitializedFileNamesupplier){
//一些复杂的逻辑,可能是也可能不是
//调用创建文件的代码
if(checkIfNeedToProcessFile()){
doSomething(lazylinitializedFileNamesupplier.get());
}
if(checkIfStillNeedFile()){
doSomethingElse(lazylinitializedFileNamesupplier.get());
}
}
//到目前为止,我们确信即使生成了该文件,它也不再存在
我不想创建一个内部类,因为我绝对肯定这个类不会在任何地方使用,除非我需要在其中使用它的方法(我也可能希望使用该方法中声明的局部变量,可能是var
类型)。匿名类必须扩展或实现一些东西,就像任何其他Java类一样,即使只是java.lang.Object
例如:
Runnable r = new Runnable() {
public void run() { ... }
};
button.addActionListener(new ActionListener(){ // ActionListener is an interface
public void actionPerformed(ActionEvent e){
}
});
这里,r
是实现Runnable
的匿名类的对象
匿名类可以使用相同的语法扩展另一个类:
SomeClass x = new SomeClass() {
...
};
您不能实现多个接口。您需要一个命名类来完成此操作。但是,匿名内部类和命名类都不能扩展多个类。匿名类通常实现一个接口:
new Runnable() { // implements Runnable!
public void run() {}
}
JFrame.addWindowListener( new WindowAdapter() { // extends class
} );
如果你的意思是你是否可以实现2个或更多的接口,那么我认为这是不可能的。然后,您可以创建一个结合了这两者的私有接口。虽然我很难想象你为什么想要一个匿名类有这样的功能:
public class MyClass {
private interface MyInterface extends Runnable, WindowListener {
}
Runnable r = new MyInterface() {
// your anonymous class which implements 2 interaces
}
}
匿名类总是扩展超类或实现接口。例如:
Runnable r = new Runnable() {
public void run() { ... }
};
button.addActionListener(new ActionListener(){ // ActionListener is an interface
public void actionPerformed(ActionEvent e){
}
});
此外,尽管匿名类不能实现多个接口,但您可以创建一个扩展其他接口的接口,并让您的匿名类实现它。一个匿名类在创建其对象时正在扩展或实现它
// The interface
interface Blah {
void something();
}
...
// Something that expects an object implementing that interface
void chewOnIt(Blah b) {
b.something();
}
...
// Let's provide an object of an anonymous class
chewOnIt(
new Blah() {
@Override
void something() { System.out.println("Anonymous something!"); }
}
);
例如:
Interface in = new InterFace()
{
..............
}
这里,匿名类正在实现接口
Class cl = new Class(){
.................
}
这里,匿名类扩展了一个抽象类。我想没有人理解这个问题。我猜这家伙想要的是这样的:
return new (class implements MyInterface {
@Override
public void myInterfaceMethod() { /*do something*/ }
});
因为这将允许多个接口实现:
return new (class implements MyInterface, AnotherInterface {
@Override
public void myInterfaceMethod() { /*do something*/ }
@Override
public void anotherInterfaceMethod() { /*do something*/ }
});
这真是太好了;但是这在Java中是不允许的
可以做的是在方法块内部使用:
public AnotherInterface createAnotherInterface() {
class LocalClass implements MyInterface, AnotherInterface {
@Override
public void myInterfaceMethod() { /*do something*/ }
@Override
public void anotherInterfaceMethod() { /*do something*/ }
}
return new LocalClass();
}
我认为第二个表达式不正确。您已经将类的名称声明为SomeClass,它不再是匿名的。查看此链接当您“新建”一个接口时,通过扩展“对象”类并实现该接口创建一个匿名类。但是,当您使用编写的第一个表达式“新建”一个类时,将通过扩展该类来创建一个匿名类(实际上,它是该匿名类的一个实例)。@youmiss:第二个表达式将创建一个扩展
SomeClass
的匿名类的实例。它仍然是匿名的,因为{…}
。我明白了,我忽略了{…}。我看不出有什么区别。你的和我的有什么不同。一个漂亮而紧凑的答案,我在你的答案中错过的是像“总是”或“必须”:)不幸的是,你必须让构造函数在不可见的地方可见。我喜欢这个答案,因为它对那些想在一个非实现中实现2个或更多接口的人来说是谷歌友好的。确切地说,这就是OP想要我竖起大拇指回答问题的目的。这很正常,所以人们喜欢回答应该问的问题,而不是已经问过的问题。