Непроверенное предупреждение о приведении с абстрактным методом, предоставляющим конкретное возвращаемое значение

Я пишу тесты селена для приложения, которое имеет очень стандартные страницы, которые можно легко смоделировать с помощью общей структуры в качестве базы для страниц, с несколькими базовыми типами (в основном это страницы со списком записей, и страницы редактирования, где можно редактировать одну запись). Чтобы смоделировать это у меня есть эти два класса:

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 ответа

Решение

Я мог бы перепроектировать проблему. 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<>();
    }
    //...
}

Просто добавьте следующую строку над строкой с предупреждением:

@SuppressWarnings("unchecked")
Другие вопросы по тегам