Я работаю над некоторым служебным кодом, который использует проверку JSR-303 для проверки объекта запроса. То, что я хотел бы сделать, - это выбросить пользовательское исключение RuntimeException, когда проверка не завершилась с использованием Set
ConstraintViolations
.Исключение с общим набором 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>>
, что делает violations
Set<ContraintViolation<Message>>
, делая violations
Set<ContraintViolation<Message>>
, установив его на HashSet<ContraintViolation<Message>>
затем итерации из newViolations
и т.д. Каждый доказал, чтобы дать множество различных ошибки компилятора. Как я могу получить Set
от ContraintViolation<T>
, где <T>
является некоторым расширением Request
и заставить его работать?
Я знаю, что вы не можете распространять общий с исключениями, но то, что я хочу, является общим на множестве, а не исключением. Я предполагаю, что я спрашиваю, есть ли способ иметь набор суперклассов/interface, где я могу легко пройти в набор наборов/суперклассов. – CodeChimp