代码之家  ›  专栏  ›  技术社区  ›  Thomas Auinger

枚举值(类<T>枚举类型,字符串名)问题

  •  33
  • Thomas Auinger  · 技术社区  · 14 年前

    基本上我想达到这样的目标:

    String enumName = whatever.getEnumName();
    Class<? extends Enum<?>> enumClass = whatever.getEnumClass();
    Enum<?> enumValue = Enum.valueOf(enumClass, enumName);
    

    不管我做什么,我总是以那个编译错误结束。老实说,泛型和枚举对我来说太不可思议了。。。

    我在这里做错什么了?

    3 回复  |  直到 14 年前
        1
  •  30
  •   Sean Patrick Floyd    14 年前

    我认为它不会像这样工作,除非您有权访问类型变量(通过类型或方法签名)。问题是方法签名 Enum.valueOf :

    public static <T extends Enum<T>> T valueOf(
        Class<T> enumType,
        String name
    );
    

    没有类型变量就不可能得到T。但是,如果您愿意抑制某些编译器警告,则可以这样做:

    public enum King{
        ELVIS
    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(final String[] args){
        final Class<? extends Enum> enumType = King.class;
        final Enum<?> theOneAndOnly = Enum.valueOf(enumType, "ELVIS");
        System.out.println(theOneAndOnly.name());
    }
    

    输出:

    猫王

        2
  •  24
  •   Tom Hawtin - tackline    14 年前

    Class<? extends Enum<?>> . 我们想要 E extends Enum<E> ,但我们无法获取,因为我们有两个不同的通配符。

    enum MyEnum {
        ME;
    }
    
    public class EnName {
        public static void main(String[] args) {
            Enum<?> value = of(MyEnum.class, "ME");
            System.err.println(value);
        }
        private static <E extends Enum<E>> E of(Class<E> clazz, String name) {
            E value = Enum.valueOf(clazz, name);
            return value;
        }
    }
    

    但是思考是肮脏的,很少是你想要的。别这么做。

        3
  •  6
  •   Sbodd    10 年前

    实际上有一种替代方法:您可以使用 Class.getEnumConstants 把你自己的实现 Enum.valueOf 没有相同类型的问题。缺点是你得到了一个普通的 Enum<?> 枚举值 无论如何。

    private static Enum<?> findEnumValue(Class<? extends Enum<?>> enumType, String value) {
        return Arrays.stream(enumType.getEnumConstants())
                     .filter(e -> e.name().equals(value))
                     .findFirst()
                     .orElse(null);
    }
    

    null 如果没有这样的常数 IllegalArgumentException ,但这是一件需要改变的小事。