簡體   English   中英

如何在構造函數中獲取具有泛型參數的類的構造函數

[英]How to get constructor of a class with a generic parameter in the constructor

問題:要獲取類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));

創建新的Class C對象時,上述代碼配置將導致NoSuchMethodException ,因為它找不到Class A的構造函數

我現在正在嘗試使用:

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

作為classA.getConstructor行中B.class的替代品,因為我猜這里是問題所在,因為類B是T的超類型(在類A中)。

但是...當我使用methodInA.getReturnType()時,它返回B.class! 而不是擴展了B的類。然后,我找到了getGenericReturnType()方法,但是它返回Type對象。

這對我有用:

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的方法。我已經更新了您的代碼以說明這樣做的一種方法。

getConstructor()僅返回公共構造函數。 嘗試使用getDeclaredConstructor()

編輯:

問題在於H構造函數沒有將B作為參數,而是X(它是B的子類)。 因此,構造函數的簽名為H(X, D, E, F) 此構造函數僅接受X實例作為其第一個參數。 它不接受任何類型的B實例,僅接受X實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM