Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名类的多重继承_Java_Multiple Inheritance_Anonymous Class - Fatal编程技术网

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想要我竖起大拇指回答问题的目的。这很正常,所以人们喜欢回答应该问的问题,而不是已经问过的问题。