簡體   English   中英

獲取實現接口的通用枚舉的值

[英]Get values of generic enum that implements an interface

我有以下界面:

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() 主要目標是以相同的方式管理多個相關的枚舉。

我懷疑你可能正在尋找類似的東西:

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類型。

Class對象調用getEnumConstants() 正如 javadoc 所說:

如果此 Class 對象不表示枚舉類型,則返回此枚舉類的元素或null

你的方法的簽名也是錯誤的。 以下是如何編寫它:

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

當然,它可能會返回null ,因為不能保證Class對象是一個枚舉類。 例如,對於以下類, getEnums(Foo.class)返回null

public class Foo implements GenericMethods {
    @Override
    public String getString() {
        return "Boo!!";
    }
}

要確保Class是枚舉類,請將方法更改為:

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

測試

getEnums(Foo.class); // fails to compile
SpecificEnum[] enums = getEnums(SpecificEnum.class);
System.out.println(Arrays.toString(enums));

輸出

[A, B, C]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM