gpt4 book ai didi

java - 泛型和类 >,EnumSet.allOf(class) 与 class.getEnumConstants()

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:48 26 4
gpt4 key购买 nike

我有以下 BeanValidation 代码可以正常工作,并允许验证注释的 bean:

  @EnumValue(enumClass = MyTestEnum.class)
private String field;

public enum MyTestEnum {
VAL1, VAL2;
}

只有当字段值为“VAL1”或“VAL2”时才会被验证。

public class EnumNameValidator implements ConstraintValidator<EnumValue, String> {

private Set<String> AVAILABLE_ENUM_NAMES;

@Override
public void initialize(EnumValue enumValue) {
Class<? extends Enum<?>> enumSelected = enumValue.enumClass();
Set<? extends Enum<?>> enumInstances = Sets.newHashSet(enumSelected.getEnumConstants());
AVAILABLE_ENUM_NAMES = FluentIterable
.from(enumInstances)
.transform(PrimitiveGuavaFunctions.ENUM_TO_NAME)
.toImmutableSet();
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if ( value == null ) {
return true;
} else {
return AVAILABLE_ENUM_NAMES.contains(value);
}
}

}

我不明白的是为什么我的第一次尝试失败了。使用以下代码代替 enumSelected.getEnumConstants():

Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected);

Intellij 12 没有突出显示任何错误,但编译器说:

java: method allOf in class java.util.EnumSet<E> cannot be applied to given types;
required: java.lang.Class<E>
found: java.lang.Class<capture#1 of ? extends java.lang.Enum<?>>
reason: inferred type does not conform to declared bound(s)
inferred: capture#1 of ? extends java.lang.Enum<?>
bound(s): java.lang.Enum<capture#1 of ? extends java.lang.Enum<?>>

我不明白这个问题,我也有可以正常工作的代码:

  private static <T extends Enum<T> & EnumAlternativeName> T safeGetByAlternativeName(Class<T> enumClass, String alternativeName) {
for ( T t : EnumSet.allOf(enumClass) ) {
if ( t.getAlternativeName().equals(alternativeName) ) {
return t;
}
}
return null;
}

最佳答案

我的猜测是在 ? extends Enum<?>两个?可能不同而 allOf期望一个 T extends Enum<T>两个T是一样的。

例如,考虑以下代码:

static enum MyEnum {}
static class EnumValue<T extends Enum<T>> {
Class<T> enumClass;
EnumValue(Class<T> enumClass) {
this.enumClass = enumClass;
}
Class<T> enumClass() { return enumClass; }
}

这些行将编译:

EnumValue<?> enumValue = new EnumValue(MyEnum.class); // raw constructor
Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumValue.enumClass());

因为我们知道这两个 TenumValue.enumClass()是一样的,但这不会:

EnumValue enumValue = new EnumValue(MyEnum.class);
Class<? extends Enum<?>> enumSelected = enumValue.enumClass();
Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected);

因为您使用 Class<? extends Enum<?>> 丢失了信息作为中间步骤。

关于java - 泛型和类 <?扩展 Enum<?>>,EnumSet.allOf(class) 与 class.getEnumConstants(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15366375/

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