3

ジェネリック戻り型が必要なメソッドから次のエラーが発生しています。

Description Resource    Path    Location    Type
Type mismatch: cannot convert from PageTypeOne to P SecuredPage.java

オブジェクトをジェネリック型パラメーターにキャストすることでエラーを取り除くことができますが、この特定のメソッドでこれを行う必要がある理由がわかりませんが、他のクラスの他の場所で書いた他の同様のメソッドではそうではありません。

プロジェクトの基本構造は次のとおりです。

保護されていない Web ページの基本クラス Page
すべての保護された Web ページの基本クラス SecuredPage

今日、同様の質問がありましたが、これは Stack Overflow コミュニティの助けを借りて解決されました: Bound mismatch error and java generic method .

私は今、同様の方法で別の問題を抱えています。

ページを構築するヘルパー メソッドを使用した基本ページ クラスは次のとおりです。

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<T extends SecuredPage<T>> extends Page<T> {

    .....
}

これは、SecuredPage 内から実装しようとしているメソッドです。Web アプリケーションのメソッドでリンクを開いた結果として生じる両方のタイプのページを返す単一のメソッドを使用できるようにしたいと考えています。

public final <P extends SecuredPage<P>> P loadContext(final String context) throws
NoSuchElementException {
    Menu m = pageHeader.getMenu();
    WebElement link = m.clickLink(context);
    String linkHref = link.getAttribute("href");

    if (linkHref.contains("somematchtext")) {
            return Page.constructPage(getDriver(), getTimeoutInSeconds(),   
                PageTypeOne.class); <==== This is where I get the error
    } else if (linkHref.contains("someothermatchtext")) {
            return Page.constructPage(getDriver(), getTimeoutInSeconds(), 
                PageTypeTwo.class); <==== This is wheere I get the error
    }
 }

PageTypeOne と PageTypeTwo は両方とも SecuredPage を拡張します。

public final class PageTypeOne extends SecuredPage<PageTypeOne> {
    .....
}


public final class PageTypeTwo extends SecuredPage<PageTypeTwo> {
    .....
}

LoginPage クラスには、誰かが無効な資格情報でログインしようとした場合に LoginPage を返し、有効な資格情報でログインした場合に HomePage (SecuredPage を拡張する) を返す同様のメソッドがあります。その方法ではこのエラーは発生しません。また、Page クラスの constructPage メソッドでもエラーが発生しないため、SecuredPage の loadContext メソッドでこのエラーが発生する理由がよくわかりません。

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

2 に答える 2