2015-02-16 4 views
0

Я работаю над некоторым служебным кодом, который использует проверку JSR-303 для проверки объекта запроса. То, что я хотел бы сделать, - это выбросить пользовательское исключение RuntimeException, когда проверка не завершилась с использованием SetConstraintViolations.Исключение с общим набором ConstraintViolations

Все объекты моего запроса, в конечном счете, реализуют один и тот же интерфейс, позволяют называть его Request. Я думаю, есть AbstractRequest, который реализует Request, а затем кучу реализаций AbstractRequest, например MyRequest.

За исключением, что я пытаюсь сделать что-то вроде:

public class RequestViolationException extends RuntimeException { 
    private Set<ConstraintViolation<? extends Request>> violations; 

    public <T extends Request> RequestViolationException(Set<ConstraintViolation<T>> newViolations) { 
    this.violations = newViolations; 
    } 
} 

И я называю это нравится:

Set<ConstraintViolation<MyRequest>> violations = validator.validate(myRequest); 
if (violations.size() > 0) { 
    throw new RequestViolationException(violations); 
} 

Но это не работает. Я попробовал несколько других вариантов на эту тему, как сделать конструктор взять Set<ConstraintViolation<? extends Request>>, что делает violationsSet<ContraintViolation<Message>>, делая violationsSet<ContraintViolation<Message>>, установив его на HashSet<ContraintViolation<Message>> затем итерации из newViolations и т.д. Каждый доказал, чтобы дать множество различных ошибки компилятора. Как я могу получить Set от ContraintViolation<T>, где <T> является некоторым расширением Request и заставить его работать?

ответ

1

Вы не можете продлить исключение с дженериков: http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCatch

+0

Я знаю, что вы не можете распространять общий с исключениями, но то, что я хочу, является общим на множестве, а не исключением. Я предполагаю, что я спрашиваю, есть ли способ иметь набор суперклассов/interface, где я могу легко пройти в набор наборов/суперклассов. – CodeChimp

1

На самом деле @JGilardi правильно, ваш конструктор принимает <T extends Request>, но вы пытаетесь присвоить его переменной экземпляра violations, который <? extends Request> что является незаконным. Пожалуйста, обратитесь к http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html за подробным объяснением.

Чтобы параметризовать переменную экземпляра с тем же <T extends Request>, вам необходимо параметризовать класс, который снова расширяет RuntimeException и, следовательно, не параметризуется. :(

Смежные вопросы