2

Javaプログラムで次のようなことが起こっています:

void f(Object o) {
    g(o);
}

<T extends MySuperClass & MyInterface> void g(T x) {
    ...;
}

これが機能するように o をキャストするにはどうすればよいですか? ジェネリックを使用せずに、変数宣言で基底クラスとインターフェイスの両方を指定する方法はないようです。o はリフレクションを使用して動的に作成されているため、ジェネリックはここでは機能しないと思います。そのため、実際のクラスはコンパイル時にわかりません。

(ええ、私はこれがやりたいことが奇妙なことであることを知っています.しかし、私は実際にはスーパークラスとインターフェースの両方からの機能が必要です.instanceofを使用して実行時にすべての型チェックを行うことができると思いますが、それはJavaのようです. 1.4...)

4

4 に答える 4

3

「生の」ジェネリックメソッドを呼び出す方法がないようです。ただし、生の型のオブジェクトを作成することはできます (次の変換は明らかに安全ではありません)。

void f(Object o) {
    Caster<?> c = new Caster(); 
    g(c.cast(o)); 
}

class Caster<T extends MySuperClass & MyInterface> {
    public T cast(Object o) {
        return (T) o;
    }
}
于 2010-02-22T00:10:12.673 に答える
2

f()呼び出しを含むクラス内に新しい内部クラスを作成できますg()

static abstract class MyCastingClass extends MySuperClass implements MyInterface {}

次に、キャストできます:

 g((MyCastingClass)o);

編集:

ただし、これは機能していないようです。

コードをコンパイルでき、警告はありませんが、ClassCastExceptionオブジェクトが実際にのインスタンスでない限り、実行時に が表示されますMyCastingClass

于 2010-02-21T23:46:47.800 に答える
1

以下のように、リフレクションを使用してgを呼び出すことができますが、正しい方法を選択し、例外を処理するためのチェックがさらに追加されています。

Object dest_obj_containing_g = this; // Replace with your object.
Method[] methods = dest_obj_containing_g.getClass().getDeclaredMethods();
for (Method m : methods) {
  if (m.getName().equals("g")) {
    m.invoke(dest_obj_containing_g,o);
    break;
  }
}
于 2010-02-22T00:34:31.223 に答える
-1

それは次のようなものでしょうか

<T extends MySuperClass implements MyInterface>

私はちょうどここで推測しています...

于 2010-02-21T23:43:08.753 に答える