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 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.