首页 > 解决方案 > 获取实现接口的通用枚举的值

问题描述

我有以下界面:

public interface GenericMethods {
  public String getString();
}

使用这个接口,我实现了这个枚举:

public enum SpecificEnum implements GenericMethods {
  A("NOT"), B("RELATED"), C("TEXT");

  SpecificEnum(String string) {
    this.string = string;
  }

  private String string;
  
  @Override
  public String getString() {
    return this.string;
  }
}

现在,我希望能够使用参数调用函数,SpecificEnum.class并能够values()在该参数上调用函数,以及返回数组元素的接口方法。像这样的东西:

class Main {
  public static void main(String[] args) {
    for (GenericMethods gm : getEnums(SpecificEnum.class)) {
      System.out.printf(gm.getString());
    }
  }

  public static T[]<T extends GenericMethods> getEnums(Class<T> enum1) {
    enum1.values();
  }
}

但是,经过大量搜索,我还没有遇到过使用泛型和枚举同时实现接口的案例。我也对泛型类型进行了很多思考,但我找不到能够调用values()泛型枚举类的正确语法。主要目标是以相同的方式管理多个相关的枚举。

标签: javagenericsenumsinterface

解决方案


我怀疑您可能正在寻找类似的东西:

public static <T extends Enum<T> & GenericMethods> T[] getEnums(Class<T> enum1) {
    return enum1.getEnumConstants();
}

public static void main(String[] args) {
    for (GenericMethods gm : getEnums(SpecificEnum.class)) {
        System.out.println(gm.getString());
    }
}

结果:(
演示:https ://ideone.com/v6on2p )

NOT
RELATED
TEXT

变化:

  • 在返回类型之前移动<T extends GenericMethods>,因为只有泛型方法可以声明其泛型类型。
  • 修改泛型类型以<T extends Enum<T> & GenericMethods>强制 T 也是某些 Enum 的子类型,除了实现 GenericMethods
  • 使用getEnumConstants()而不是values()我们使用的Class,而不是enum类型。

推荐阅读