gpt4 book ai didi

java - 限制映射键和值类型 - 更复杂

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:31 24 4
gpt4 key购买 nike

我有一个更复杂的问题(比问题“Java map with values limited by key's type parameter”的问题)要在 Map 中映射键和值类型。在这里:

interface AnnotatedFieldValidator<A extends Annotation> {
void validate(Field f, A annotation, Object target);
Class<A> getSupportedAnnotationClass();
}

现在,我想将 validator 存储在映射中,以便我可以编写以下方法:

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);
}
}
}
}

(这里省略了类型参数,因为我没有解决方案)。我还希望能够注册我的 validator :

public void addValidator(AnnotatedFieldValidator<? extends Annotation> v) {
validators.put(v.getSupportedAnnotatedClass(), v);
}

使用这个(唯一的)公共(public)修饰符方法,我可以确保映射包含键(注释类)与 validator 支持的注释类匹配的条目。

这是一个尝试:

我这样声明 validator Map:

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有一个类型参数 (A),它同时用作 getSupportedAnnotationClass() 的返回类型并作为 validate() 的参数;因此,在将注释转换为 supportedAnnotationClass 时,我应该能够将其作为参数传递给 validate() .为什么 getSupportedAnnotationClass() 的结果是被视为与 validate() 的参数不同的类型?

我可以解决 validate()通过删除 validator 声明和 validate() 中的通配符来实现的方法方法,但是,当然,addValidator()不编译。

最佳答案

您可以提取一个方法来获取 validator 。所有对 validators Map 的访问都是通过类型检查方法进行的,因此是类型安全的。

    protected <A extends Annotation> AnnotatedFieldValidator<A> getValidator(A a) {
// unchecked cast, but isolated in method
return (AnnotatedFieldValidator<A>) validators.get(a);
}

public void validate(Object o) {
Object target = null;
Field[] fields = getAllFields(o.getClass());
for (Field field : fields) {
for (Annotation a : field.getAnnotations()) {
AnnotatedFieldValidator<Annotation> validator = getValidator(a);
if (validator != null) {
validator.validate(field, a, target);
}
}
}
}

// Generic map
private Map<Class<? extends Annotation>, AnnotatedFieldValidator<? extends Annotation>> validators;

(删除了第二个重复的建议。)

关于java - 限制映射键和值类型 - 更复杂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com