java – 泛型和类<?扩展枚举<?>>,EnumSet.al
发布时间:2020-12-14 05:03:25 所属栏目:Java 来源:网络整理
导读:我有以下BeanValidation代码工作正常,并允许验证一个bean注释与: @EnumValue(enumClass = MyTestEnum.class) private String field; public enum MyTestEnum { VAL1,VAL2; } 仅当字段值为“VAL1”或“VAL2”时才会被验证. public class EnumNameValidator i
我有以下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; } 解决方法
我的猜测是在吗?扩展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<?扩展枚举>>作为中间步骤. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |