我有一堆类都具有相同的构造函数签名。我有一个方法,基于一些参数(在构造函数中不是相同的参数)返回该类型的对象,但我似乎无法弄清楚如何使一个适用于所有类的泛型方法。
作为不同的方法分开,我可能有这样的事情:
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)
。
这是否可以使用反射和泛型类型?
答案 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)