绑定不匹配错误和java泛型方法

Sel*_*ena 5 java generics selenium-webdriver

我收到以下错误:

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>>
Run Code Online (Sandbox Code Playgroud)

我正在尝试登录并返回主页,如果成功,则返回LoginPage,如果不使用泛型.

我有一个基类,Page由SecuredPage扩展,用于登录墙后面的页面.我写了一个通用的辅助方法来构造任何类型的页面.LoginPage上的登录方法使用此方法.LoginPage扩展页面和HomePage扩展SecuredPage.SecuredPage扩展了Page.如果返回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);       
    }
}
Run Code Online (Sandbox Code Playgroud)

这是SecuredPage类:

public class SecuredPage extends Page<SecuredPage> {

    .....
}
Run Code Online (Sandbox Code Playgroud)

这是主页:

public final class HomePage extends SecuredPage {
    ......
}
Run Code Online (Sandbox Code Playgroud)

这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 6

问题是,这HomePage是一个Page<SecuredPage>而不是一个Page<HomePage>.该login方法Page<HomePage>将从其通用签名返回a .

您必须创建HomePage与其自身相关的泛型参数,而不是SecuredPage.这将解决编译器错误.保持SecuredPage通用,但要确保其范围扩展SecuredPage<T>.然后分配HomePage本身泛型参数THomePage.

class SecuredPage<T extends SecuredPage<T>> extends Page<T> {
...
}
class HomePage extends SecuredPage<HomePage>  {
...
}
Run Code Online (Sandbox Code Playgroud)