我有以下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);
- 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;
- }
解决方法
我的猜测是在吗?扩展Enum<?他们俩 ?可以是不同的,而allOf期望T扩展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());
因为我们知道这两个在enumValue.enumClass()中的T是一样的,但是这不会:
- EnumValue enumValue = new EnumValue(MyEnum.class);
- Class<? extends Enum<?>> enumSelected = enumValue.enumClass();
- Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected);
因为您已经使用Class<?扩展枚举>>作为中间步骤.