Java Unchecked Cast Предупреждение: требуется ArrayList <T>, найдено ArrayList <Contract> - PullRequest
0 голосов
/ 18 февраля 2019

Я добавляю Generics в мой класс разбиения на страницы в Java.У меня возникают проблемы с исправлением кода, чтобы избежать этих предупреждений о «непроверенном приведении» для метода public ArrayList<T> getNextPage()

Предупреждение.* найдено: java.util.ArrayList
Вкл .:
return (ArrayList<T>) getPaginatedContracts(startRow, pageSize);

Предупреждение: java: непроверенное приведение
обязательно: java.util.ArrayList
найдено: java.util.ArrayList

Вкл .:
return (ArrayList<T>) getPaginatedJobs(startRow, pageSize);

В данный момент T может быть либо Contract, либоa Job.

Есть ли другой способ вернуть ArrayList<T>, который правильно использует Generics без каких-либо предупреждений?

Или, поскольку мой конструктор принимает Class<T> и выполняет какую-то проверку типа: Например,
if (clazz.isAssignableFrom(Contract.class)) {...}
Допустимо ли мне использовать @SuppressWarnings("unchecked") на getNextPage()?

public class PaginationWrapper<T> {

    private Class<T> clazz;
    private int currentPage;
    private int pageSize;

    public PaginationWrapper(Class<T> clazz) {
        this.clazz = clazz;
        this.currentPage = -1;
        this.pageSize = 100;
    }

    private static ArrayList<Contract> getPaginatedContracts(int startRow, int pageSize) {
        ArrayList<Contract> list = new ArrayList<>(pageSize);
        // Get info from database
        return list;
    }

    private static ArrayList<Job> getPaginatedJobs(int startRow, int pageSize) {
        ArrayList<Job> list = new ArrayList<>(pageSize);
        // Get info from database
        return list;
    }

    public ArrayList<T> getNextPage() {
        currentPage++;
        int startRow = currentPage * pageSize;
        if (clazz.isAssignableFrom(Contract.class)) {
            // Warning: java: unchecked cast
            // required: java.util.ArrayList<T>
            // found: java.util.ArrayList<Contract>
            return (ArrayList<T>) getPaginatedContracts(startRow, pageSize);
        } else if (clazz.isAssignableFrom(Job.class)) {
            // Warning: java: unchecked cast
            // required: java.util.ArrayList<T>
            // found: java.util.ArrayList<Job>
            return (ArrayList<T>) getPaginatedJobs(startRow, pageSize);
        }
        return null;
    }


    static class Contract {
    }

    static class Job {
    }

    public static void main(String[] args) {
        PaginationWrapper<Contract> contractWrapper = new PaginationWrapper<>(Contract.class);
        ArrayList<Contract> paginatedList = contractWrapper.getNextPage();
    }
}

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете сделать этот класс абстрактным, и тогда подкласс должен реализовать фактический вызов базы данных:

public abstract class PaginationWrapper<T> {
    private int currentPage = 1;
    private int pageSize = 100;

    public ArrayList<T> getNextPage() {
        currentPage++;
        int startRow = currentPage * pageSize;

        // here we delegate to the implementation
        return getNextPage(startRow, pageSize);
    } 

    protected abstract ArrayList<T> getNextPage(int startRow, int pageSize);
}

И затем создать 2 подкласса

public class JobPagination extends PaginationWrapper<Job> {
    protected ArrayList<Job> getNextPage(int startRow, int pageSize) {
         return /* list from database */
    }
}

public class ContractPagination extends PaginationWrapper<Contract> {
    protected ArrayList<Contract> getNextPage(int startRow, int pageSize) {
         return /* list from database */
    }
}

Теперь общая логика упакованав PaginationWrapper, но фактическая логика базы данных теперь находится в определенном подклассе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...