[
https://issues.apache.org/jira/browse/TAP5-901?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dan Adams updated TAP5-901:
---------------------------
Attachment: tap5-901-patch.txt
patch with a test case that reproduces the exception. the property binding
should see the return type as String but it's actually Object thus causing a
big fat exception.
> Generics return wrong type when subclassing page
> ------------------------------------------------
>
> Key: TAP5-901
> URL: https://issues.apache.org/jira/browse/TAP5-901
> Project: Tapestry 5
> Issue Type: Bug
> Affects Versions: 5.1.0.4
> Reporter: Mike Leonardo
> Attachments: tap5-901-patch.txt
>
>
> I have a custom library that has the following classes:
> {{{
> public abstract class AbstractViewPage<T extends StaticPage<T, V>, V extends
> StaticPageVersion> {
> private static final Pattern ID = Pattern.compile("^\\d+$");
> @InjectDao(StaticPage.class) private Dao<T> dao;
> @Inject private Response response;
> private T page;
> void onActivate(String key) throws IOException {
> if (ID.matcher(key).matches())
> page = dao.get(Long.parseLong(key));
> else {
> page = dao.get(eq("name", key));
> }
>
> if (page != null && page.getLive() == null)
> page = null;
>
> if (page == null)
> response.sendError(404, "Page not found");
> }
>
> public T getPage() {
> return page;
> }
> public void setPage(T page) {
> this.page = page;
> }
> /** Returns the versioned content to display. */
> public V getContent() {
> if (page == null)
> return null;
>
> return page.getLive();
> }
> }
> }}}
> {{{
> /** Displays a static page */
> @Public
> public class Page extends AbstractViewPage<IFPStaticPage,
> IFPStaticPageVersion> {
>
> @Inject private IAuth auth;
> @Inject private HttpServletRequest request;
> @Inject private HttpServletResponse response;
>
> Object onActivate() {
> IFPStaticPage page = getPage();
> if (page != null && page.isRestricted() &&
> auth.getAccount(request, response) == null)
> return "start";
>
> return null;
> }
>
> public boolean isTopLevel() {
> return getPage() == getPage().getSectionPage();
> }
>
> void onEndElementFromBreadcrumb(Element e) {
> if ("a".equals(e.getName()))
>
> e.getContainer().raw(" › ");
> }
>
> }
> }}}
> As you can see, based on generics the method "getContent" should return a
> IFPStaticPageVersion.
> This works fine when I use this Page.class directly.
> Recently I wanted to extend this Page.class to add a few features specific to
> one project. When I extended this class (no template so that it would use the
> Page.class template) I ended up getting an error on the subclass. The error
> occurred because getContent returned a completely different class instead of
> IFPStaticPageVersion.
> I work around I found to fix this is to override the getContent method so
> that it explicitly defines the return type. But I had to do this in both
> Page.class and the subclass (Page2.class). Here's my addition to both
> classes:
> {{{
> @Override
> public IFPStaticPageVersion getContent() {
> return super.getContent();
> }
> }}}
> Obviously I shouldn't have to do this to get the correct class back
> (especially not to both Page.class AND Page2.class.
>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.