如何在构造函数中获取具有泛型参数的类的构造函数

时间:2012-07-06 10:52:26

标签: java

问题:在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));

上面的代码配置会在创建新的C类对象时产生NoSuchMethodException,因为它无法找到A类的构造函数

我现在正在尝试使用:

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

作为B.class行中classA.getConstructor的替代,因为我猜这是问题所在,因为B类是超类型的T(在A类中)。

然而......当我使用methodInA.getReturnType()时,它返回B.class!而不是一个扩展了B的类。然后我找到了一个getGenericReturnType()方法,但它返回一个Type对象。

2 个答案:

答案 0 :(得分: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 :(得分:0)

getConstructor()仅返回 public 构造函数。试试getDeclaredConstructor()

编辑:

问题是H构造函数不将B作为参数,而是取X(它是B的子类)。因此构造函数的签名是H(X, D, E, F)。此构造函数仅接受X的实例作为其第一个参数。它不接受任何类型的B个实例,只接受X的实例。

相关问题