匿名クラスはどのようにしてスーパークラスを拡張したり、インターフェースを実装したりできますか?
匿名クラスはどのようにしてスーパークラスを拡張したり、インターフェースを実装したりできますか?
回答:
匿名クラスは、たとえ他のJavaクラスと同じように、何かを拡張または実装する必要がありjava.lang.Object
ます。
例えば:
Runnable r = new Runnable() {
public void run() { ... }
};
ここでr
は、を実装する匿名クラスのオブジェクトですRunnable
。
匿名クラスは、同じ構文を使用して別のクラスを拡張できます。
SomeClass x = new SomeClass() {
...
};
できないことは、複数のインターフェースを実装することです。これを行うには、名前付きクラスが必要です。ただし、匿名の内部クラスも名前付きクラスも、複数のクラスを拡張することはできません。
SomeClass
。のため、まだ匿名{...}
です。
匿名クラスは通常、インターフェースを実装します。
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
}
}
誰もその質問を理解していなかったと思います。この男が欲しかったものは次のようなものだったと思います:
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();
}
// 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(){
.................
}
ここでは、匿名クラスが抽象クラスを拡張しています。