带有提供特定 return 值的抽象方法的未经检查的强制转换警告
Unchecked cast warning with abstract method providing specific return value
我正在为一个应用程序编写 selenium 测试,该应用程序具有非常标准的页面,可以很容易地通过通用结构建模作为页面的基础,只有少数基本类型(主要是包含记录列表的列表页面,以及可以编辑一条记录的编辑页面)。为了对此建模,我有这两个 类:
public abstract class AbstractListPage<E extends EditPage> extends AbstractSelfOpeningPage implements ListPage {
// Provides the specific object for the edit page when it's opened
protected abstract E editPageHook();
public E getEditPage() {
return editPageHook();
}
public E openEditPage(String key, boolean search) {
//Do page opening stuff like clicking buttons
// Return new object for the page that has been opened
return getEditPage();
}
}
// Implementation class
public class DossiersListPage extends AbstractListPage<DossierPage> {
@Override
protected DossierPage<DossiersListPage> editPageHook() {
return new DossierPage<>(driver, this);
}
}
// Usage in test, this shows an unchecked cast warning
DossierPage<DossiersListPage> dossierPage = new DossiersListPage(driver).openPage().openEditPage("3905");
我想知道是否有解决此问题的好方法,我错过了什么?我目前没有遇到任何问题,但我的测试代码中的警告让我感到有些疑惑。
这里使用泛型的原因是我可以在我的页面上为元素建模,return它们所属的页面以流畅的方式:
public abstract class AbstractPageElement<P extends Page> implements PageElement<P> {
@Override
public P click() throws TimeoutException {
// Do click
return page;
}
}
// DossierPage
public class DossierPage<L extends ListPage> extends AbstractEditPage<L> {
public OrderDate<DossierPage<L>> orderDate = new OrderDate<>(driver, this);
public OrderType<DossierPage<L>> orderType = new OrderType<>(driver, this);
public Status<DossierPage<L>> status = new Status<>(driver, this);
}
// Test
dossierPage.orderDate.click()
.orderType.click()
.status.click();
只需在发出警告的行上方添加以下行:
@SuppressWarnings("unchecked")
我可以对问题进行逆向工程。 DossierPage
必须看起来像这样:
public class DossierPage<E extends AbstractListPage> extends EditPage {
//...
}
所以现在我们解决了问题。您可以通过指定更多类型参数来解决它:
public class DossiersListPage extends
AbstractListPage<DossierPage<DossiersListPage>> { // this is the tricky part
@Override
protected DossierPage<DossiersListPage> editPageHook() {
return new DossierPage<>();
}
//...
}
我正在为一个应用程序编写 selenium 测试,该应用程序具有非常标准的页面,可以很容易地通过通用结构建模作为页面的基础,只有少数基本类型(主要是包含记录列表的列表页面,以及可以编辑一条记录的编辑页面)。为了对此建模,我有这两个 类:
public abstract class AbstractListPage<E extends EditPage> extends AbstractSelfOpeningPage implements ListPage {
// Provides the specific object for the edit page when it's opened
protected abstract E editPageHook();
public E getEditPage() {
return editPageHook();
}
public E openEditPage(String key, boolean search) {
//Do page opening stuff like clicking buttons
// Return new object for the page that has been opened
return getEditPage();
}
}
// Implementation class
public class DossiersListPage extends AbstractListPage<DossierPage> {
@Override
protected DossierPage<DossiersListPage> editPageHook() {
return new DossierPage<>(driver, this);
}
}
// Usage in test, this shows an unchecked cast warning
DossierPage<DossiersListPage> dossierPage = new DossiersListPage(driver).openPage().openEditPage("3905");
我想知道是否有解决此问题的好方法,我错过了什么?我目前没有遇到任何问题,但我的测试代码中的警告让我感到有些疑惑。
这里使用泛型的原因是我可以在我的页面上为元素建模,return它们所属的页面以流畅的方式:
public abstract class AbstractPageElement<P extends Page> implements PageElement<P> {
@Override
public P click() throws TimeoutException {
// Do click
return page;
}
}
// DossierPage
public class DossierPage<L extends ListPage> extends AbstractEditPage<L> {
public OrderDate<DossierPage<L>> orderDate = new OrderDate<>(driver, this);
public OrderType<DossierPage<L>> orderType = new OrderType<>(driver, this);
public Status<DossierPage<L>> status = new Status<>(driver, this);
}
// Test
dossierPage.orderDate.click()
.orderType.click()
.status.click();
只需在发出警告的行上方添加以下行:
@SuppressWarnings("unchecked")
我可以对问题进行逆向工程。 DossierPage
必须看起来像这样:
public class DossierPage<E extends AbstractListPage> extends EditPage {
//...
}
所以现在我们解决了问题。您可以通过指定更多类型参数来解决它:
public class DossiersListPage extends
AbstractListPage<DossierPage<DossiersListPage>> { // this is the tricky part
@Override
protected DossierPage<DossiersListPage> editPageHook() {
return new DossierPage<>();
}
//...
}