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

ログインを試みて、成功した場合は 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);
    }
}
4

5 に答える 5

2

Calling login(user, SecuredPage.class) works, but login(user, HomePage.class) does not. The reason is: type parameter T in SecuredPage is SecuredPage. HomePage is a subclass of SecuredPage, so the T type parameter of HomePage is SecuredPage as well.

Now, you call login with a Page<HomePage>. But such a class does not exist. HomePage is a subclass of Page<SecuredPage>.

于 2013-04-08T16:25:18.810 に答える
1

Bounded GenericsHomePageを使用して拡張SecuredPageしたい場合は、' Generic Substitution ' を HomePage まで渡してください。

Generic atを代入しないで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 に答える