0

私はコンパイルされなかったこのコードから始めました:

Object[] obj= new Object[2];
obj[0]=new Object () { public String compute() {return "yay 1!";} };
obj[1]=new Object () { public String compute() {return "yay 2!";} };

for (Object o : obj)
    System.out.println(o.compute());

compute()Object にはメソッドが定義されていないためです。したがって、Java が関数を破棄したと想定しました。ただし、以下は機能しました。

Object[] obj= new Object[2];
obj[0]=new Object () { public String toString() {return "yay 1!";} };
obj[1]=new Object () { public String toString() {return "yay 2!";} };

for (Object o : obj)
    System.out.println(o);

では、Java にはまだ関数定義がどこかに格納されている必要がありますね。それとも、私がオーバーライドしているためですtoString()か?

compute()私の質問は、存在するJavaをどのように伝えるのですか?

それができない場合、最初の例で行ったように、オブジェクトに存在するメソッドをオーバーライドするようなことはできますか? compute()実際に表すメソッドは、 を取るメソッドですint。これは恐ろしいかもしれませんが、オーバーライドする必要がありますwait(long l)か?

前もって感謝します。

4

2 に答える 2

5

Java はメソッドを「破棄」しませんでした。その配列に入れたインスタンスはそれを所有していますが、Java の型システムには、それらを外部コードで使用できるようにする機能がありません。

たとえば、リフレクションによってメソッドの存在を確認できます。

匿名クラスにさらにメソッドが必要な場合は、適切なインターフェイスを定義して を使用しますnew MyInterface() { ... }

于 2013-06-04T09:44:46.623 に答える