2

問題: クラス C で A のサブクラス (以下に示すクラス H など) のパラメーター化されたコンストラクター参照を取得する。

Class A<T extends B> {
  public A(T objectT, D objectD, E objectE, F objectF) {

  }

  public T aMethodWithTAsReturnType();
}

Class B { }

Class C<T extends A<?>> {
  private Constructor<?> classAConstructor;
  public C(Class<T> classA) {
     classAConstructor=classA.getConstructor(B.class, D.class,E.class,F.class)
  }
}

Class H extends A<X> {
  public H(X objectX, D objectD, E objectE, F objectF) {}
}

Class X extends B {}

new C(new H(objectX,objectD,objectE,objectF));

上記のコード構成ではNoSuchMethodException、クラス A のコンストラクターが見つからないため、新しいクラス C オブジェクトが作成されたときにが発生します。

私は今使用しようとしています:

Method methodInA = classA.getMethod('aMethodWithTAsReturnType')
Class<?> TClassInA = methodInA.getReturnType();

クラスBは(クラスAの)Tのスーパータイプであるため、ここでの問題だと推測しているためB.class、行内の の代わりとして。classA.getConstructor

ただし... methodInA.getReturnType() を使用すると、B.class が返されます。B を拡張したクラスではなく、getGenericReturnType()メソッドを見つけましたが、Type オブジェクトを返します。

4

2 に答える 2

1

これは私のために働く:

public class G {
    static class A<T extends B> {
        A(T objectT, D objectD, E objectE, F objectF) { }
    }

    static class B { }

    static class C<XT extends B, T extends A<XT>> {
        private Constructor<?> classAConstructor;
        public C(Class<T> classA, Class<XT> classX) throws SecurityException, 
            NoSuchMethodException {
            classAConstructor = classA.getConstructor(classX, D.class,
                    E.class, F.class);
        }
    }
    static class D { }
    static class E { }
    static class F { }

    static class X extends B { }

    public static class H extends A<X> {
        public H(X objectT, D objectD, E objectE, F objectF) {
            super(objectT, objectD, objectE, objectF);
        }
    }

    public static void main(String[] args) throws SecurityException,
        NoSuchMethodException {
        new C<X, H>(H.class, X.class);
    }
}

更新: A のパラメーター化を C に渡す何らかの方法を見つける必要があります。その方法の 1 つを説明するためにコードを更新しました。

于 2012-07-06T11:25:18.203 に答える
0

getConstructor()publicコンストラクターのみを返します。で試してくださいgetDeclaredConstructor()

編集:

問題は、H コンストラクターが引数として B ではなく、X (B のサブクラス) を取ることです。したがって、コンストラクターのシグネチャはH(X, D, E, F). Xこのコンストラクターは、最初の引数としてのインスタンスのみを受け入れます。どの種類のインスタンスも受け入れませんが、のBインスタンスのみを受け入れますX

于 2012-07-06T11:00:21.667 に答える