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);
}
}