100

匿名クラスで 2 つ (またはそれ以上) のインターフェイスを実装するにはどうすればよいですか? あるいは、クラスの拡張インターフェースの実装の両方を行うにはどうすればよいでしょうか? たとえば、2 つのインターフェイスを拡張する匿名クラスのオブジェクトを作成したいとします。

    // 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;
            }
        }
    };

AutoCloseable次に、遅延初期化されたユーティリティ クラスとして、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

このクラスは、それを使用する必要があるメソッド以外のどこでも使用されないことが確実であるため、内部クラスを作成したくありません (また、そのメソッドで宣言されたローカル変数を使用することもできます。タイプであることvar)。

4

6 に答える 6

103

匿名クラス、他の Java クラスと同様に、たとえjava.lang.Object.

例えば:

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

ここでrは、 を実装する匿名クラスのオブジェクトですRunnable

匿名クラスは、同じ構文を使用して別のクラスを拡張できます。

SomeClass x = new SomeClass() {
   ...
};

できないことは、複数のインターフェースを実装することです。そのためには、名前付きクラスが必要です。ただし、匿名内部クラスも名前付きクラスも、複数のクラスを拡張することはできません。

于 2011-05-01T13:04:40.273 に答える
37

匿名クラスは通常、インターフェースを実装します。

new Runnable() { // implements Runnable!
   public void run() {}
}

JFrame.addWindowListener( new WindowAdapter() { // extends  class
} );

2つ以上のインターフェースを実装できるかどうかということであれば、それは不可能だと思います。その後、2 つを組み合わせたプライベート インターフェイスを作成できます。匿名クラスにそれを持たせたい理由は簡単には想像できませんが:

 public class MyClass {
   private interface MyInterface extends Runnable, WindowListener { 
   }

   Runnable r = new MyInterface() {
    // your anonymous class which implements 2 interaces
   }

 }
于 2011-05-01T13:06:00.207 に答える
16

匿名クラスは、常にスーパークラスを拡張するか、インターフェイスを実装します。例えば:

button.addActionListener(new ActionListener(){ // ActionListener is an interface
    public void actionPerformed(ActionEvent e){
    }
});

さらに、匿名クラスは複数のインターフェースを実装することはできませんが、他のインターフェースを拡張するインターフェースを作成し、匿名クラスにそれを実装させることができます。

于 2011-05-01T13:06:31.693 に答える
3
// 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!"); }
    }
);
于 2011-05-01T13:06:56.730 に答える
1

匿名クラスは、そのオブジェクトの作成中に拡張または実装しています。次に例を示します。

Interface in = new InterFace()
{

..............

}

ここで匿名クラスは Interface を実装しています。

Class cl = new Class(){

.................

}

ここで匿名クラスは抽象クラスを拡張しています。

于 2015-06-15T11:05:51.367 に答える