Java Generi c метод для приема любого класса и возврата данных? - PullRequest
1 голос
/ 05 августа 2020

В коде Spring Batch при написании batchUpdate я добавил обработку исключений, в случае сбоя каких-либо записей я обрабатываю ниже logi c, который отлично работает. Но в моем проекте около 70 писателей, и я хотел создать общий метод c для приведенного ниже кода и во время выполнения передать класс Employee, Department, Student, Stock et c и получить детали обратно.

Как я могу это сделать?

private List<Employee> getFailedRecords(Exception e, List<? extends Employee> items, Map<Integer, String> map){
    List<Employee> data = new ArrayList<>();
    if (e.getCause() instanceof BatchUpdateException) {
        BatchUpdateException be = (BatchUpdateException) e.getCause();
        int[] batchRes = be.getUpdateCounts();
        if (batchRes != null && batchRes.length > 0) {
            for (int index = 0; index < batchRes.length; index++) {
                if (batchRes[index] == Statement.EXECUTE_FAILED) {
                    data.add(items.get(index));
                    map.put(index, e.getMessage());
                }
            }
        }
    }
    return data;
}

1 Ответ

1 голос
/ 05 августа 2020

Вы можете просто сделать метод generi c:

private <T> List<T> getFailedRecords(Exception e, List<? extends T> items, 
        Map<Integer, String> map) {
    
    List<T> data = new ArrayList<>();
    
    if (e.getCause() instanceof BatchUpdateException) {
        BatchUpdateException be = (BatchUpdateException) e.getCause();
        int[] batchRes = be.getUpdateCounts();
        if (batchRes != null && batchRes.length > 0) {
            for (int index = 0; index < batchRes.length; index++) {
                if (batchRes[index] == Statement.EXECUTE_FAILED) {
                    data.add(items.get(index));
                    map.put(index, e.getMessage());
                }
            }
        }
    }

    return data;
}

Если не требуется ограниченный подстановочный знак (например, когда вам нужно передать список подклассов Employee / Student, et c.), вы сможете обойтись без него и введите второй параметр как List<T>.

...