通过反射调用构造函数,而不使用泛型强制转换



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

作为不同的方法分开,我可能会有这样的东西:

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)

对于反射和泛型类型,这是可能的吗?

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

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

如果你所有的实现类都实现了一些接口或子类或基类,那么你可能想要在T上设置一个绑定:

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

相关内容

  • 没有找到相关文章

最新更新