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つの異なるオブジェクトをお互いにキャストしようとしています。 'login'メソッドは' HomePage'インスタンスを返すので、 'currentPage'変数にそのメソッドの戻り値を割り当てないのはなぜですか? – EsotericVoid
'HomePage'が' LoginPage'のスーパークラスでない限り、 'HomePage'を' LoginPage'にキャストすることはできません。注:これはジェネリックスそのものとは関係ありません。これはまっすぐな参照型キャストです。 –
'CurrentPage = GetInstance(BasePage.class)'があると思っていますが、冒頭にHomePageのインスタンスになっているので、キャストは動作しません。 –