Связанная ошибка несоответствия и общий метод Java

Я получаю следующую ошибку:

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

Я пытаюсь выполнить вход в систему и вернуть HomePage, если все прошло успешно, и LoginPage, если не используется обобщение.

У меня есть базовый класс, страница которого расширена SecuredPage для страниц за стеной входа в систему. Я написал универсальный вспомогательный метод, который будет создавать страницы любого типа. Этот метод используется методом входа в систему на странице входа в систему. LoginPage расширяет страницу, а HomePage расширяет SecuredPage. SecuredPage расширяет страницу. Метод login работает, если возвращается LoginPage, но я получаю вышеуказанную ошибку, пытаясь вернуть HomePage. Поскольку HomePage является подклассом страницы, поскольку его родительский класс расширяет Page, я не понимаю, почему HomePage не является допустимой заменой ограниченного параметра.<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);       
    }
}

Это класс SecuredPage:

public class SecuredPage extends Page<SecuredPage> {

    .....
}

И это HomePage:

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

Это 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);
    }
}

Ответы на вопрос(4)

Ваш ответ на вопрос