泛型java.lang.ClassCastException

泛型java.lang.ClassCastException,java,selenium,generics,Java,Selenium,Generics,有人能解释一下如何修复这个代码吗?每当我运行LoginTest时,我都会得到java.lang.ClassCastException:features.pages.HomePage不能转换为features.pages.LoginPage。这两个类都是BasePage的子类,没有泛型的转换工作正常 public class Base { public static BasePage currentPage; public <T extends BasePage> T GetIns

有人能解释一下如何修复这个代码吗?每当我运行
LoginTest
时,我都会得到
java.lang.ClassCastException:features.pages.HomePage不能转换为features.pages.LoginPage
。这两个类都是BasePage的子类,没有泛型的转换工作正常

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);
}}
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");

找到了错误所在。我没有将返回值赋给
currentProject
属性

改变

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


修正了这个问题

你说没有泛型的铸造效果好是什么意思?您正试图将两个不同的对象彼此投射。既然
login
方法返回
HomePage
实例,为什么不将所述方法的返回值赋给
currentPage
变量?除非
HomePage
LoginPage
的超类,否则不能将
HomePage
强制转换为
LoginPage
。注意:这与泛型本身无关,这只是直接的引用类型转换。我认为如果您有
CurrentPage=GetInstance(BasePage.class)
可能会有一些希望,但因为您在一开始就安排它成为HomePage的一个实例,虽然这两个类都是BasePage的子类,但不能从一个子类转换到另一个子类。这两种类型都是引用类型,因为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");
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");`