Error de desajuste de enlace y método genérico de Java

Estoy teniendo el siguiente 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>>

Estoy intentando hacer un inicio de sesión y devolver una página de inicio, si tengo éxito y una página de inicio de sesión si no se utilizan genéricos.

Tengo una clase base, página que se extiende por SecuredPage para las páginas detrás del muro de inicio de sesión. Escribí un método de ayuda genérico que construiría páginas de cualquier tipo. Este método es utilizado por el método de inicio de sesión en LoginPage. LoginPage extiende la página y HomePage extiende SecuredPage. SecuredPage extiende la página. El método de inicio de sesión funciona si se devuelve LoginPage, pero recibo el error anterior al intentar devolver una HomePage. Dado que HomePage es una subclase de la página porque su clase primaria se extiende a la página, estoy confundido en cuanto a por qué HomePage no es un sustituto válido para el parámetro delimitado<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);       
    }
}

Esta es la clase SecuredPage:

public class SecuredPage extends Page<SecuredPage> {

    .....
}

Y esta es HomePage:

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

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta