java – 泛型和类<?扩展枚举<?>>,EnumSet.allOf(class)vs class.getEnumConstants()

前端之家收集整理的这篇文章主要介绍了java – 泛型和类<?扩展枚举<?>>,EnumSet.allOf(class)vs class.getEnumConstants()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下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<?扩展枚举>>作为中间步骤.

原文链接:https://www.f2er.com/java/123666.html

猜你在找的Java相关文章