Seb*_*ber 10 java generics enums class
我有以下BeanValidation代码可以正常工作,并允许验证带有注释的bean:
@EnumValue(enumClass = MyTestEnum.class)
private String field;
public enum MyTestEnum {
VAL1, VAL2;
}
Run Code Online (Sandbox Code Playgroud)
仅在字段值为"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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么我的第一次尝试失败了.使用enumSelected.getEnumConstants()
以上代码代替以上代码:
Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected);
Run Code Online (Sandbox Code Playgroud)
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<?>>
Run Code Online (Sandbox Code Playgroud)
我不明白这个问题,我也有那个工作正常的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
我的猜测是,? 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; }
}
Run Code Online (Sandbox Code Playgroud)
这些行将编译:
EnumValue<?> enumValue = new EnumValue(MyEnum.class); // raw constructor
Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumValue.enumClass());
Run Code Online (Sandbox Code Playgroud)
因为我们知道,这两个T
中enumValue.enumClass()
是相同的,但是这不会:
EnumValue enumValue = new EnumValue(MyEnum.class);
Class<? extends Enum<?>> enumSelected = enumValue.enumClass();
Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected);
Run Code Online (Sandbox Code Playgroud)
因为您使用Class<? extends Enum<?>>
中间步骤丢失了信息.