泛型和类< extends Enum<?>>,EnumSet.allOf(class)vs class.getEnumConstants() [英] Generics and Class<? extends Enum<?>>, EnumSet.allOf(class) vs class.getEnumConstants()

查看:988
本文介绍了泛型和类< extends Enum<?>>,EnumSet.allOf(class)vs class.getEnumConstants()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  @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();
设置< ;? 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()

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

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

  java:类java.util.EnumSet中的方法allOf< E>不能应用于给定类型; 
必需:java.lang.Class< E>
found:java.lang.Class< capture#1 of? extends java.lang.Enum<?>>
reason:推断类型不符合声明的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;
}


解决方案

code>? extends Enum <?> 两个可以不同, allOf code> T extends Enum< T> 其中 T 都是相同的。



例如,请考虑以下代码:

  static enum MyEnum {} 
static class EnumValue< T extends枚举> {
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());

因为我们知道两个 T enumValue.enumClass()是相同的,但不会:

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

,因为您通过使用 Class <将Enum<?>> 扩展为中间步骤。


I have the following BeanValidation code that works fine, and permits to validate that a bean annotated with:

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

  public enum MyTestEnum {
    VAL1, VAL2;
  }

Will be validated only if the field value is "VAL1" or "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);
    }
  }

}

What I don't understand is why my first attempt failed. Using instead of the enumSelected.getEnumConstants() above the following code:

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

Intellij 12 doesn't highlight any error, but the compiler says:

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<?>>


I don't understand the problem, and I also have that code which works fine:

  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;
  }

解决方案

My guess is that in ? extends Enum<?> the two ? could be different whereas allOf expects a T extends Enum<T> where both T are the same.

For example, consider the following code:

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; }
}

These lines will compile:

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

because we know that the two T in enumValue.enumClass() are the same but this won't:

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

because you have lost information by using a Class<? extends Enum<?>> as an intermediate step.

这篇关于泛型和类&lt; extends Enum&lt;?&gt;&gt;,EnumSet.allOf(class)vs class.getEnumConstants()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆