【问题标题】:How do I dynamically cast Java object如何动态转换 Java 对象
【发布时间】:2020-08-16 22:29:25
【问题描述】:

我有以下方法:

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

提前致谢

【问题讨论】:

    标签: java class reflection reflections


    【解决方案1】:

    循环变量没有使用泛型。如果你尝试会发生什么:

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

    如果编译器也不喜欢这样,那么在分配新实例之前如何转换它:

    queryGetter = (Category) s.newInstance();
    

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2012-05-15
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多