Associated mismatch error and java generic method

I get the following error:

Bound mismatch: The generic method constructPage(WebDriver, int, Class<T>) of type     
Page<T> is not applicable for the arguments (WebDriver, int, Class<HomePage>). The 
inferred type HomePage is not a valid substitute for the bounded parameter <T extends 
Page<T>>

I am trying to login and return HomePage if successful and LoginPage if it does not use generic files.

I have a base class whose page is extended by SecuredPage for pages beyond the entrance wall. I wrote a general helper method that will create pages of any type. This method is used by the loginPage login method. LoginPage extends the page and HomePage extends SecuredPage. SecuredPage expands the page. The login method works if LoginPage is returned, but I get the above error trying to return HomePage. Since HomePage is a subclass of the page because its parent class extends the page, I am confused about why HomePage is not a valid substitute for a limited parameter <T extends Page<T>>.

public abstract class Page<T extends Page<T>> extends SlowLoadableComponent<T> {

    protected static final <T extends Page<T>> T constructPage(WebDriver driver, 
    int timeoutInSeconds, java.lang.Class<T> pageClass) 
    {
        Page<T> p = null;

        try {
            Constructor<T> pageConstructor = pageClass.getConstructor(
            WebDriver.class, String.class, Integer.TYPE);
            p = pageConstructor.newInstance(driver, driver.getCurrentUrl(), 
                timeoutInSeconds);
            p.get();

        } catch(Exception e) {

        }

        return pageClass.cast(p);       
    }
}

This is the SecuredPage class:

public class SecuredPage extends Page<SecuredPage> {

    .....
}

And this is HomePage:

public final class HomePage extends SecuredPage {
    ......
}

This is LoginPage:

public final class LoginPage extends Page<LoginPage>  {


    public final HomePage loginWithGoodCredentials(final User user) {
        return login(user, HomePage.class);
    }

    public final LoginPage loginWithBadCredentials(final User user) {
        return login(user, LoginPage.class);
    }


    public final <T extends Page<T>> T login(final User user, final Class<T>     
            expectedPage) {
        enterUsername(user.getUsername());
        enterPassword(user.getPassword());
         loginButton.click();

        return Page.constructPage(getDriver(), getTimeoutInSeconds(), 
        expectedPage);
    }
}
+5
source share
4 answers

, HomePage Page<SecuredPage>, a Page<HomePage>. login Page<HomePage> .

HomePage , SecuredPage. . SecuredPage , , SecuredPage<T>. HomePage T HomePage.

class SecuredPage<T extends SecuredPage<T>> extends Page<T> {
...
}
class HomePage extends SecuredPage<HomePage>  {
...
}
+6

login(user, SecuredPage.class) , login(user, HomePage.class) . : T SecuredPage SecuredPage. HomePage SecuredPage, T HomePage SecuredPage.

login Page<HomePage>. . HomePage Page<SecuredPage>.

+2

HomePage SecuredPage , "Generic Substitution" HomePage.

SecuredPage, SecuredPage

public class  SecuredPage<T extends Page<T>> extends Page<T> {

}

HomePage , ,

public class HomePage extends SecuredPage<HomePage> {

}

+1

constructPage

protected static final <T extends Page<?>> T constructPage(...) 
{
    Page<?> p = null;
    //...
}
+1

All Articles