我收到以下错误:
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);
}
}
最佳答案
问题是 HomePage
是 Page<SecuredPage>
而不是 Page<HomePage>
. login
方法将返回 Page<HomePage>
来自其通用签名。
您必须制作 HomePage
的通用参数与自身相关,而不是SecuredPage
.这将解决编译器错误。保持SecuredPage
通用的,但要确保它的边界扩展 SecuredPage<T>
.然后分配HomePage
本身为通用参数 T
在 HomePage
.
class SecuredPage<T extends SecuredPage<T>> extends Page<T> {
...
}
class HomePage extends SecuredPage<HomePage> {
...
}
关于java - 绑定(bind)不匹配错误和java泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15883896/