我如何获得valueOf通用枚举?

时间:2018-08-01 22:26:42

标签: java

我正在尝试使用一个默认方法创建一个接口,该方法返回该枚举的valueOf(string)或null,因为它没有任何枚举,因此我可以轻松实现它而无需粘贴此方法的非泛型变体我需要此类东西的所有类中的代码。所以我尝试这样做,但无法编译:

public interface EnumWNull<T extends Enum<T>> {
    default T getEnumOrNull(String value){
        try {
            return Enum.valueOf(T /*Error: expression expected*/, value);
        }catch (Exception e){
            return null;
        }
    }
}

我不明白为什么。而且我实际上知道我可以读取所有值并手动搜索它,但是我想知道一种比学习和优雅更好的方法(如果有的话,我觉得应该有更好的方法) t,valueOf的静态变体的目的是什么?)。

3 个答案:

答案 0 :(得分:6)

如果不通过Class对象,就无法做到这一点。您需要模仿Enum.valueOf()的签名:

static <T extends Enum<T>> T getEnumOrNull(Class<T> enumType, String name) {
    try {
        return Enum.valueOf(enumType, name);
    } catch (IllegalArgumentException e) {
        return null;
    }
}

答案 1 :(得分:2)

建议不要创建带有默认方法的接口,而建议创建静态实用程序方法。 @shmosel的答案很好地做到了这一点,但我建议使用Optional来传达该方法可以返回null(我已经分叉了他的代码)。

public static <T extends Enum<T>> Optional<T> getEnumValue(Class<T> enumType, String name) {
    try {
        return Optional.of(Enum.valueOf(enumType, name));
    } catch (IllegalArgumentException e) {
        return Optional.empty();
    }
}

答案 2 :(得分:0)

public static T getEnumOrNull(Class enumType, String name) { 返回 nonNull(name) ? Enum.valueOf(enumType, name) : null; }