Как динамически привести объект Java - PullRequest
3 голосов
/ 02 мая 2020

У меня есть следующий метод:

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() вернет true

, я наконец получу экземпляр com.dpd.modules.OracleQueryGetterPortalCorp?

Спасибо за авансовый

1 Ответ

0 голосов
/ 04 мая 2020

Переменные l oop не используют обобщения. Что произойдет, если вы попытаетесь:

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

Если компилятору это тоже не понравится, как насчет приведения нового экземпляра перед его назначением:

queryGetter = (Category) s.newInstance();
...