2017-07-19 6 views
0

誰かこのコードを修正する方法を教えてください。私はLoginTestを実行するたびに、私はjava.lang.ClassCastException: features.pages.HomePage cannot be cast to features.pages.LoginPage .BothクラスがBasePageクラスのサブクラスをしている取得し、ジェネリックずにキャストすると、Generics java.lang.ClassCastException

public class Base { 

public static BasePage currentPage; 

public <T extends BasePage> T GetInstance(Class<T> page) { 
    Object obj = PageFactory.initElements(DriverContext.Driver, page); 
    return page.cast(obj); 
}} 

BasePage.java

public abstract class BasePage extends Base { 


public <T extends BasePage> T As(Class<T> pageInstance) { 
    try { 
     return (T) this; 
    } catch (Exception e) { 
     e.getStackTrace(); 
    } 
    return null; 
}} 

LoginPage.java

public class LoginPage extends BasePage { 

public HomePage login(String username, String password) { 
    txtUserName.sendKeys(username); 
    txtPassword.sendKeys(password); 
    btnLogin.submit(); 

    return GetInstance(HomePage.class); 
}} 

LoginTest.javaを正常に動作します

public class LoginTest extends Base{ 
@Test 
public void Login() { 

    currentPage = GetInstance(HomePage.class); 
    currentPage.As(HomePage.class).clickLogin(); 
    // breaks at login() 
    currentPage.As(LoginPage.class).login("admin", "password"); 
+2

ジェネリックスなしのキャスティングがうまく動作するとはどういう意味ですか? 2つの異なるオブジェクトをお互いにキャストしようとしています。 'login'メソッドは' HomePage'インスタンスを返すので、 'currentPage'変数にそのメソッドの戻り値を割り当てないのはなぜですか? – EsotericVoid

+2

'HomePage'が' LoginPage'のスーパークラスでない限り、 'HomePage'を' LoginPage'にキャストすることはできません。注:これはジェネリックスそのものとは関係ありません。これはまっすぐな参照型キャストです。 –

+0

'CurrentPage = GetInstance(BasePage.class)'があると思っていますが、冒頭にHomePageのインスタンスになっているので、キャストは動作しません。 –

答えて

0

エラーの内容を確認しました。戻り値をcurrentProject属性に割り当てていませんでした。

currentPage = GetInstance(HomePage.class); 
currentPage = currentPage.As(HomePage.class).clickLogin(); 
currentPage.As(LoginPage.class).login("admin", "password");` 

currentPage = GetInstance(HomePage.class); 
currentPage.As(HomePage.class).clickLogin(); 
currentPage.As(LoginPage.class).login("admin", "password");` 

を変更

は、問題を修正しました。