Błąd niedopasowania powiązań i ogólna metoda java

Otrzymuję następujący błąd:

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

Próbuję się zalogować i zwrócić stronę główną, jeśli się powiedzie, i stronę logowania, jeśli nie używasz nazw ogólnych.

Mam klasę podstawową, stronę, która jest rozszerzona przez SecuredPage dla stron za ścianą logowania. Napisałem ogólną metodę pomocniczą, która tworzyła strony dowolnego typu. Ta metoda jest używana przez metodę logowania w LoginPage. LoginPage rozszerza stronę i stronę domową przedłuża SecuredPage. SecuredPage rozszerza stronę. Metoda logowania działa, jeśli zwracany jest loginPage, ale otrzymuję powyższy błąd, próbując zwrócić stronę główną. Ponieważ HomePage jest podklasą strony, ponieważ jej klasa macierzysta rozszerza stronę, jestem zdezorientowany, dlaczego HomePage nie jest prawidłowym substytutem ograniczonego parametru<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);       
    }
}

To jest klasa SecuredPage:

public class SecuredPage extends Page<SecuredPage> {

    .....
}

A to jest strona główna:

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

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

questionAnswers(4)

yourAnswerToTheQuestion