使用提供特定返回值的抽象方法取消选中强制转换警告

时间:2016-06-21 07:44:10

标签: java generics unchecked-cast

我正在为一个应用程序编写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");

我想知道是否有一种解决这个问题的好方法,我错过了什么?我目前没有任何问题,但是我的测试代码上的警告让我觉得有些不确定。

这里的泛型的原因是我可以在我的页面上模拟元素,以一种流畅的方式返回它们所属的页面:

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();

2 个答案:

答案 0 :(得分:2)

我可以对问题进行逆向工程。 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<>();
    }
    //...
}

答案 1 :(得分:-4)

只需在提示警告的行上方添加以下行:

@SuppressWarnings("unchecked")