Снимите флажок преобразования при возврате типа класса

У меня есть метод, который возвращает тип класса, и он работает правильно. Проблема в том ... Я получаю предупреждения компиляции, указывающие на непроверенное преобразование.

Ниже я получил предупреждающее сообщение:

Warning: java: getAjaxEventPayloadClass() in <anonymous com.iyotbihagay.wicket.panel.requestpage.resultlist.ResultList2$7> implements <P>getAjaxEventPayloadClass() in com.iyotbihagay.wicket.panel.paging.Paging.Support
  return type requires unchecked conversion from java.lang.Class<com.iyotbihagay.wicket.support.RefreshSearchResultEventPayload> to java.lang.Class<P>

даже если я использую @SuppressWarnings("unchecked"), я все равно не могу избавиться от предупреждения о компиляции.

Ниже приведены некоторые коды, указывающие на предупреждение:

ResultList2.java

public class ResultList2 {
    ...
    private Component createPaging() {
        return new Paging("paging", getRequestPageContext(), new Paging.Support() {
            @Override
            public void switchPage(AjaxRequestTarget target, int targetPageNum) {
                getRequestPageContext().switchPage(target, targetPageNum);
            }
            @Override
            public int getTotalNum() {
                return getSearchResult().getTotalNum();
            }
            @Override
            public int getPageSize() {
                return getSearchResult().getPageSize();
            }
            @Override
            public int getLastPageNum() {
                return getSearchResult().getLastPageNum();
            }
            @Override
            public int getCurrentPageNum() {
                return getSearchResult().getCurrentPageNum();
            }

            @SuppressWarnings("unchecked")
            @Override
            public Class<RefreshSearchResultEventPayload> getAjaxEventPayloadClass() {
                return RefreshSearchResultEventPayload.class;
            }

            @Override
            public void decorateAjaxAttributes(AjaxRequestAttributes attributes, String pageNumMarkupId) {
                decorateAjaxRefreshSearchResult(attributes, pageNumMarkupId);
            }
        });
    }
    ...
}

Support.java

public static interface Support extends Serializable {
    ...
    <P extends AjaxEventPayload> Class<P> getAjaxEventPayloadClass();
    ...
}

Paging.java

public class Paging {
    ...
    private Support m_support;
    ...

    @Override
    public void onEvent(IEvent<?> event) {
        super.onEvent(event);
        WicketUtil.onEvent(event, m_support.getAjaxEventPayloadClass(), new AjaxEventHandler<AjaxEventPayload>() {
            @Override
            public void onEvent(IEvent<?> event, AjaxRequestTarget target, AjaxEventPayload paymentLoad) {
                m_firstPageNumModel.detach();
                m_previousPageNumModel.detach();
                m_nextPageNumModel.detach();
                m_lastPageNumModel.detach();
                target.add(m_container);
            }
        });
    }
    ...
}

WicketUtil.java

public class WicketUtil {
    ...
    public static <P extends AjaxEventPayload> void onEvent(IEvent<?> event, Class<P> targetPayload, AjaxEventHandler<P> handler) {
        if (event.getPayload() != null) {
            if (targetPayload.isAssignableFrom(event.getPayload().getClass())) {
                P p = (AjaxEventPayload)event.getPayload();
                handler.onEvent(event, p.getTarget(), p);
            }

        }
    }
    ...
}

m_support.getAjaxEventPayloadClass() вызывается / передается на WicketUtil.onEvent() ... конкретно по второму параметру. RefreshSearchResultEventPayload - это лишь один из классов, расширяющих AjaxEventPayload, и есть другие классы, которые расширяются до AjaxEventPayload и передаются в WicketUtil.onEvent().

0
0
63
1

Ответы 1

Скорее это должно быть:

public static interface Support extends Serializable {
    ...
    Class<? extends AjaxEventPayload> getAjaxEventPayloadClass();
    ...
}

а также

public class ResultList2 {
    ...
    @Override
    public Class<RefreshSearchResultEventPayload> getAjaxEventPayloadClass() {
        return RefreshSearchResultEventPayload.class;
    }
    ...
}

Причина в том, что <P extends AjaxEventPayload> означает, что метод может возвращать класс произвольного типа полезной нагрузки (в соответствии с запросом вызывающей стороны), например:

support.<AjaxEventPayload>getAjaxEventPayloadClass()

вместо того, чтобы возвращать только один тип полезной нагрузки, специфичный для реализующего класса (например, RefreshSearchResultEventPayload).

Другие вопросы по теме