如何动态转换Java对象

3

我有以下方法:

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 的实例吗?

提前致谢。

1个回答

0

循环变量未使用泛型。如果尝试,会发生什么:

for (Class<? extends Category> s : classes)

如果编译器也不喜欢这个,那么在分配之前将新实例转换一下如何:
queryGetter = (Category) s.newInstance();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接