java - 绑定(bind)不匹配错误和java泛型方法

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

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

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

    .....
}

这是主页:

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

最佳答案

问题是 HomePagePage<SecuredPage>而不是 Page<HomePage> . login方法将返回 Page<HomePage>来自其通用签名。

您必须制作 HomePage 的通用参数与自身相关,而不是SecuredPage .这将解决编译器错误。保持SecuredPage通用的,但要确保它的边界扩展 SecuredPage<T> .然后分配HomePage本身为通用参数 THomePage .

class SecuredPage<T extends SecuredPage<T>> extends Page<T> {
...
}
class HomePage extends SecuredPage<HomePage>  {
...
}

关于java - 绑定(bind)不匹配错误和java泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15883896/

相关文章:

java - 如何更改应用打开广告背景admob

java - 如何使用 Selenium 在框架/IFrame 和子框架上行走

java - 在jsp中下载图片: Illegalstateexception: getwriter() has already been called for this response

json - serde_json::from_str 错误,其中字符串来自文件

java - 以编程方式启用或禁用 TestNG 中的断言

java - 通过序列化/GSON 将对象自动转换为 double

c# - C# 7.0 中的泛型函数和 ref 返回

.net - 我怎样才能制作一个类型安全的元素包,这些元素都实现了一个通用接口(interface)?

java - 添加 pom.xml 后无法使用 IE 和 Chrome WebDrivers

selenium - Selenium 将 DOM 存储在哪里(如果有的话)?