我有一個更復雜的問題(比問題'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;
我知道我不能正確鏈接鍵和值(鏈接假設OK由於僅通過訪問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
有一個單一的類型參數(A),它既用作getSupportedAnnotationClass()
的返回類型,也用作參數validate()
;因此,在將註釋投射到supportedAnnotationClass時,我應該能夠將其作爲參數傳遞給validate()
。爲什麼getSupportedAnnotationClass()
的結果與validate()
的參數被認爲是不同的類型?
我可以通過刪除驗證程序聲明和validate()
方法中的通配符來解決validate()
方法,但當然addValidator()
不會編譯。
是的,編譯器無法知道。這就是爲什麼我有一個強制連貫性的方法(addValidator())。現在我假設這種連貫性,我應該可以調用Class.cast(Object)。您的解決方案仍然需要投射物體,這是我想避免的。 – Gaetan 2009-02-05 13:47:04