我有以下方法:
public static Category getImpl(Class<Category> category) throws IllegalAccessException, InstantiationException
{
Reflections reflections = new Reflections("com.dpd.modules");
Set<Class<? extends Category>> classes = reflections.getSubTypesOf(category);
Category queryGetter = null;
if (DDLTool.isOracle())
{
for (Class s : classes)
{
if (Oracle.class.isAssignableFrom(s))
{
queryGetter = s.newInstance();
}
}
}
else if (DDLTool.isMSSQL())
{
for (Class s : classes)
{
if (MsSql.class.isAssignableFrom(s))
{
queryGetter = s.newInstance();
}
}
}
else if (DDLTool.isPostgres())
{
for (Class s : classes)
{
if (PosgtreSql.class.isAssignableFrom(s))
{
queryGetter = s.newInstance();
}
}
}
return queryGetter;
}
然而,我无法将 queryGetter 强制转换为所需的类别。
继承树如下:
Category (Interface) -> PortalCorp extends Category (Interface) | Portal365 extends Category (Interface)
Oracle | MsSql | PosgtreSql (all Interfaces)
然后是具体的类(仅适用于PortalCorp,Portal365亦然):
MsSqlQueryGetterPortalCorp implements PortalCorp, MsSql
OracleQueryGetterPortalCorp implements PortalCorp, Oracle
PostgresQueryGetterPortalCorp implements PortalCorp, PosgtreSql
但是我在这行代码上遇到了不兼容类型(Incompatible Types)的错误提示:
queryGetter = s.newInstance();
如何以这样的方式实现所需的行为,使得如果我执行
getImpl(PortalCorp.class);
如果 DDLTool.isOracle()
返回为 true,我最终将获得 com.dpd.modules.OracleQueryGetterPortalCorp
的实例吗?
提前致谢。