2017-07-19 66 views
0

有人可以請解釋如何解決這段代碼?每當我運行LoginTest我得到java.lang.ClassCastException: features.pages.HomePage cannot be cast to features.pages.LoginPage。無論是類子類的BasePage和鑄造沒有泛型工作正常泛型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

你是什麼意思鑄造沒有泛型工作正常?您正在嘗試將兩個不同的對象投射到彼此。由於'login'方法返回一個'HomePage'實例,爲什麼不把該方法的返回值賦給'currentPage'變量呢? – EsotericVoid

+2

除非'HomePage'是'LoginPage'的超類,否則不能將'HomePage'投射到'LoginPage'。注意:這與泛型本身無關,這只是直接引用類型轉換。 –

+0

我想如果你有'CurrentPage = GetInstance(BasePage.class)',可能會有一些希望,但是因爲你已經安排在開始時將它作爲HomePage的一個實例,所以我不希望演員工作。 –

回答

0

發現錯誤是什麼。我沒有將返回值分配給currentProject屬性。

改變

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

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

固定的問題。