Bound Mismatch Error und generische Java-Methode

Ich erhalte den folgenden Fehler:

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

Ich versuche, mich anzumelden und eine HomePage zurückzugeben, wenn dies erfolgreich ist, und eine LoginPage, wenn keine Generika verwendet werden.

Ich habe eine Basisklasse, Page, die von SecuredPage für Seiten hinter der Anmeldewand erweitert wird. Ich habe eine allgemeine Hilfsmethode geschrieben, mit der Seiten aller Art erstellt werden können. Diese Methode wird von der Login-Methode auf der LoginPage verwendet. LoginPage erweitert Page und HomePage erweitert SecuredPage. SecuredPage erweitert. Die Anmeldemethode funktioniert, wenn die Anmeldeseite zurückgegeben wird. Bei dem Versuch, eine Startseite zurückzugeben, wird jedoch die oben genannte Fehlermeldung angezeigt. Da HomePage eine Unterklasse von Page ist, weil die übergeordnete Klasse Page erweitert, bin ich verwirrt, warum HomePage kein gültiger Ersatz für den begrenzten Parameter ist<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);       
    }
}

Dies ist die SecuredPage-Klasse:

public class SecuredPage extends Page<SecuredPage> {

    .....
}

Und das ist HomePage:

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

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage