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("&nbsp;&nbsp;&rsaquo;&nbsp;&nbsp;");
        }
        
}
}}}

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.

Reply via email to