通过反射调用构造函数而不使用泛型进行转换

时间:2014-05-28 23:33:29

标签: java generics reflection

我有一堆类都具有相同的构造函数签名。我有一个方法,基于一些参数(在构造函数中不是相同的参数)返回该类型的对象,但我似乎无法弄清楚如何使一个适用于所有类的泛型方法。

作为不同的方法分开,我可能有这样的事情:

public ImplementationClassA getClassA(long id)
{
    SomeGenericThing thing = getGenericThing(id);
    return new ImplementationClassA(thing);
}

public ImplementationClassB getClassB(long id)
{
    SomeGenericThing thing = getGenericThing(id);
    return new ImplementationClassB(thing);
}

正如您所看到的,它们非常相似,只是实现类别不同。如何处理所有实现类,假设它们具有相同的构造函数?

我对它进行了一次尝试,但由于T无法识别而无法正常工作......但感觉就像我想要的那样:

public T getImplementationClass(Class<T> implementationClass, long id)
{
    SomeGenericThing thing = getGenericThing(id);
    return implementationClass.getConstructor(SomeGenericThing.class)
                              .newInstance(thing);
}

调用者现在只需执行getImplementationClass(ImplementationClassA.class, someID)

这是否可以使用反射和泛型类型?

1 个答案:

答案 0 :(得分:2)

泛型语法需要声明T。在通用方法中,将泛型类型参数的声明放在<>(例如<T>)之前的返回类型,即T

public <T> T getImplementationClass(Class<T> implementationClass, long id)

如果所有实现类都实现了某个接口或子类的某些基类,那么您可能希望在T上放置一个边界:

public <T extends BaseClassOrInterface> T getImplementationClass(
    Class<T> implementationClass, long id)