지도에서 키와 값 유형을 매핑하기 위해 더 복잡한 문제가 있습니다 ('키의 유형 매개 변수로 제한된 값을 가진 Java지도'질문보다). 여기있다 :한계지도 키 및 값 유형 - 좀 더 복잡함
interface AnnotatedFieldValidator<A extends Annotation> {
void validate(Field f, A annotation, Object target);
Class<A> getSupportedAnnotationClass();
}
지금, 나는 다음과 같은 방법을 쓸 수 있도록,지도에서 유효성 검사기를 저장할 :
validate(Object o) {
Field[] fields = getAllFields(o.getClass());
for (Field field: fields) {
for (Annotation a: field.getAnnotations()) {
AnnotatedFieldValidator validator = validators.get(a);
if (validator != null) {
validator.validate(field, a, target);
}
}
}
}
(나는 가지고 있지 않기 때문에 유형 매개 변수가 생략된다 해결책). 나는 또한 내 유효성 검사기를 등록 할 수 있도록하려면 :
이 (만) 공공 수정 방법으로public void addValidator(AnnotatedFieldValidator<? extends Annotation> v) {
validators.put(v.getSupportedAnnotatedClass(), v);
}
, 나는지도가 키 (주석 클래스) 발리의 지원 주석 클래스와 일치하는 항목이 포함 보장 할 수 있습니다.
private Map<Class<? extends Annotation>, AnnotatedFieldValidator<? extends Annotation>> validators;
내가 제대로 키와 값 (링크 확인 가정을 링크 할 수 없습니다 알고 있어요 인해를 통해서만 액세스 : 나는 유효성 검사기는 다음과 같이지도 선언
: 여기
는 시도이다addValidator()
)는, 그래서 캐스트 시도 :
for (Annotation a: field.getAnnotations()) {
AnnotatedFieldValidator<? extends Annotation> validator = validators.get(a);
if (validator != null) {
validator.validate(field, validator.getSupportedAnnotationClass().cast(a), target);
}
}
을하지만이 작동하지 않습니다 The method validate(Field, capture#8-of ?, Object) in the type AnnotatedFieldValidator<capture#8-of ?> is not applicable for the arguments (Field, capture#9-of ?, Object)
.
이것이 작동하지 않는 이유를 알 수 없습니다. AnnotatedFieldValidator
에는 getSupportedAnnotationClass()
의 반환 유형과 validate()
의 매개 변수로 사용되는 단일 유형 매개 변수 (A)가 있습니다. 따라서 주석을 supportedAnnotationClass로 캐스팅 할 때 매개 변수로 validate()
에 전달할 수 있어야합니다. getSupportedAnnotationClass()
의 결과가 validate()
의 매개 변수와 다른 유형으로 간주되는 이유는 무엇입니까?
유효성 검사기 선언 및 validate()
메서드에서 와일드 카드를 제거하여 validate()
메서드를 해결할 수 있지만 물론 addValidator()
은 컴파일되지 않습니다.
암시 적 캐스트 (원시 유형을 사용하는 경우)를 명시 적으로 변환했습니다. 그러나 나는이 해결책을 받아 들일 만하다. 나는 타이핑 마술을하기 위해 내 소매에서 또 다른 일반적인 방법을 꺼내는 반사 신경을 가지고 있지 않습니다. – eljenso
당신이 받아 들일만한 해결책을 찾았다면 다행입니다. 나는 그것이 validator Map에 대한 접근을 캡슐화하기 때문에 getValidator 메소드를 추출하는 것을 선호한다. 그러나 최상위 유효성 검사 메소드에서는 좀 더 우아 해 보입니다. – flicken