5

我收到以下错误:

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

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

我有一个基类 Page,它由 SecuredPage 扩展,用于登录墙后面的页面。我写了一个通用的辅助方法,可以构造任何类型的页面。此方法由 LoginPage 上的 login 方法使用。LoginPage 扩展 Page 和 HomePage 扩展 SecuredPage。SecuredPage 扩展了 Page。如果返回 LoginPage,则 login 方法有效,但在尝试返回 HomePage 时出现上述错误。由于 HomePage 是 page 的子类,因为它的父类扩展了 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> {

    .....
}

这是主页:

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

这是登录页面:

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

5 回答 5

6

问题是它HomePage是 aPage<SecuredPage>而不是 a Page<HomePage>。该login方法Page<HomePage>将从其通用签名返回 a 。

您必须使泛型参数HomePage与自身相关,而不是SecuredPage. 这将解决编译器错误。保持SecuredPage通用,但要确保它的边界是 extends SecuredPage<T>。然后为中HomePage的泛型参数赋值。THomePage

class SecuredPage<T extends SecuredPage<T>> extends Page<T> {
...
}
class HomePage extends SecuredPage<HomePage>  {
...
}
于 2013-04-08T16:30:51.613 回答
2

调用login(user, SecuredPage.class)有效,但login(user, HomePage.class)无效。原因是:类型参数TinSecuredPageSecuredPage. HomePage是 的子类SecuredPage,所以 的T类型参数HomePage也是SecuredPage

现在,您login使用Page<HomePage>. 但是这样的类是不存在的。HomePage是 的子类Page<SecuredPage>

于 2013-04-08T16:25:18.810 回答
1

如果您仍然希望在存在Bounded GenericsHomePage的情况下进行扩展,请将“ Generic Substitution ”传递到 HomePage。SecuredPage

不要将Generic替换为SecuredPage,而是 make SecuredPageas

public class  SecuredPage<T extends Page<T>> extends Page<T> {

}

在创建HomePage时,像这样声明泛型的值,

public class HomePage extends SecuredPage<HomePage> {

}

这应该基本上解决了错误

于 2013-04-08T16:36:07.680 回答
1

就您的constructPage方法而言,您可以使用

protected static final <T extends Page<?>> T constructPage(...) 
{
    Page<?> p = null;
    //...
}
于 2013-04-08T18:01:57.857 回答
0

如果您仍然面临相同的错误,请从 Window > Preferences > Java > Compiler > "Compiler Compilation level" -> 1.8 更改编译器级别的 JDK 1.8 或最新版本

于 2020-03-20T02:27:23.747 回答