我有以下方法:
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
但是我在行中收到不兼容的类型错误:
queryGetter = s.newInstance();
如果我执行,我如何实现所需的行为
getImpl(PortalCorp.class);
和DDLTool.isOracle()
返回真
我最终会得到 com.dpd.modules.OracleQueryGetterPortalCorp
的实例吗?
提前致谢
最佳答案
循环变量没有使用泛型。如果你尝试会发生什么:
for (Class<? extends Category> s : classes)
如果编译器也不喜欢那样,在分配新实例之前转换它怎么样:
queryGetter = (Category) s.newInstance();
关于java - 如何动态转换 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61559325/