次のエラーが表示されます。
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>>
ログインを試みて、成功した場合は HomePage を返し、ジェネリックを使用していない場合は LoginPage を返します。
ログインウォールの背後にあるページ用に SecuredPage によって拡張された基本クラス Page があります。任意のタイプのページを構築する汎用ヘルパー メソッドを作成しました。このメソッドは、LoginPage の login メソッドによって使用されます。LoginPage は Page を拡張し、HomePage は SecuredPage を拡張します。SecuredPage は Page を拡張します。LoginPage が返された場合、ログイン メソッドは機能しますが、HomePage を返そうとすると上記のエラーが発生します。親クラスが Page を拡張するため、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);
}
}