Exception
내에 일반 개체 모음을 저장하려고하는데 제네릭을 알아 내는데 문제가 있습니다. 특히, 나는 Hibernate Validator를 사용하고 있으며 어플리케이션의 다른 레이어에서 처리하기 위해 예외 내에 수집 된 위반 목록을 저장하려고합니다. 여기서 예이다 :예외의 인수에서 제네릭 사용
Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.size() > 0) {
throw new ValidationException("User details are invalid", violations);
}
상기 throws
라인이 정의 생성자를 도시하고, I는 ValidationException(String, Set<ConstraintViolation<User>>
생성자 서명을 변경 제안된다. 여기 ValidationException는 다음과 같습니다
public class ValidationException extends Exception {
private Set<ConstraintViolation<?>> violations;
public ValidationException() {
}
public ValidationException(String msg) {
super(msg);
}
public ValidationException(String msg, Throwable cause) {
super(msg, cause);
}
public ValidationException(String msg, Set<ConstraintViolation<?>> violations) {
super(msg);
this.violations = violations;
}
public Set<ConstraintViolation<?>> getViolations() {
return violations;
}
}
을하지만, 난 그냥 User
검증 이상 사용할 수 있도록 일반적인 ValidationException
을 유지하려는. 나는 Set<ConstraintViolation<? extends Object>>
도 시도했지만 동일한 결과를 얻습니다.
내가하려는 일을 수행 할 수있는 방법이 있습니까? @SuppressWarning("unchecked")
절대적으로 법적되도록
public class ValidationException extends Exception {
private Set<ConstraintViolation<?>> violations;
@SuppressWarning("unchecked")
public <T> ValidationException(String msg, Set<ConstraintViolation<T>> violations) {
super(msg);
this.violations = (Set<ConstraintViolation<?>>)(Set<?>) violations;
}
}
는 지금까지 내가 이해, 선택하지 않은 캐스팅,이 경우 완전히 안전 :
당신이 처음에 일반 될하기 위해 ConstrainsViolation 필요한 이유는 무엇입니까? 가능한 각 위반에 대해 AbstractBase를 상속하는 별도의 클래스를 생성 할 수 없습니까? – Falcon
제네릭 예외 형식을 사용하는 것이 좋은 생각이지만, @axtavt는 언급 한 바와 같이 예외는 일반적 일 수 없다고 생각했습니다. 이 FAQ를 참조하십시오 : http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ301 – Tauren
@Falcon :'ConstraintsViolation'은 Hibernate Validation 패키지의 일부이며 generics를 사용합니다. 그것은 내 자신의 수업이 아닙니다. – Tauren