有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java接受任何枚举作为参数

public static <E extends Enum<E>> List<E> enumHeadAsList(final Class<E> val, final E topValue)
{
    // My code
}

我想创建一个接受我给出的任何枚举的方法,并设置该枚举的默认值,以执行一些顺序检查,然后将所有值作为列表返回。基本上我想要一个枚举的头和返回值。到目前为止,我成功地做到了这一点,但我不知道如何继续下去

我想调用如下方法:

enumHeadAsList(BuffType.class, BuffType.SELF);


共 (2) 个答案

  1. # 1 楼答案

    这应该可以做到:

    public static <E extends Enum<E>> List<E> enumHeadAsList(final E topValue)
    {
      E[] values = topValue.getDeclaringClass().getEnumConstants();
      if (topValue.ordinal() != 0) {
        E oldTop = values[0];
        values[0] = topValue;
        values[topValue.ordinal()] = oldTop;
      }
      return List.of(values);
    }
    

    这段代码假设您不太关心其余元素的顺序(因为顶部元素只需与之前的第一个元素交换)

    如果希望保持其他值的相对顺序不变,则必须调整并用以下代码块替换上面的if

    final int topValueIndex = topValue.ordinal();
    if (topValueIndex != 0) {
      System.arraycopy(values, 0, values, 1, topValueIndex);
      values[0] = topValue;
    }
    

    请注意,如果不允许topValuenull,则不需要专用的Class<E>参数,因为我们可以从topValue获取枚举类

    如果使用Java 9之前的Java版本,那么可以将List.of()替换为Arrays.asList(),不同之处在于生成的List是可变的

  2. # 2 楼答案

    EnumSet让这变得简单:

    public static <E extends Enum<E>> List<E> enumHeadAsList(final Class<E> val, final E topValue)
    {
        List<E> values = new ArrayList<>();
    
        values.add(topValue);
        values.addAll(EnumSet.complementOf(EnumSet.of(topValue)));
    
        return values;
    }
    

    complementOf返回除参数中存在的枚举值之外的所有枚举值的集合。所以,complementOf(EnumSet.of(topValue))是除topValue之外的所有值