簡體   English   中英

如果枚舉類是Java方法中的參數,如何獲取枚舉值?

[英]How to get enum values if enum class is parameter in method in Java?

我有多個枚舉。 這是一個例子:

   public enum Telomeres {

    TELOMERE_1("TTAGGG"), TELOMERE_2("TTCAAA");

    public String telomere;

    Telomeres(String telomere){
        this.telomere = telomere;
    }

    public String getSequence() {
        return telomere;
    }
}

我正在嘗試創建循環枚舉類的所有值並檢查 String 是否至少包含這些值之一的方法(帶有枚舉參數)。 不幸的是,我無法獲得枚舉值來檢查字符串是否包含它們。 這是代碼,它說明了問題。

public <T extends Enum<T>> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin) {

    for(T e: enumData.values()) { // I get error here
        if(chromatin.contains(e.getSequence())){ // Also I have problems here 
            hasTranscriptionStopSite = true;
            break;
        }            
    }
    return hasTranscriptionStopSite;                
}

對於如何解決這個問題或糾正我的觀點的任何建議,我將不勝感激。

要從Class對象中獲取枚舉值,您可以使用Class.getEnumConstants()

如果您想訪問getSequence()函數。 你應該使用一個接口:

public interface SequenceProvider {
    String getSequence();
}

public enum Telomeres implements SequenceProvider {
    /*
    ...
    */

    @Override
    public String getSequence() {
        return telomere;
    }
}

並更改hasTranscriptionStopSite(Class, String)的簽名以保證T擴展接口:

public <T extends Enum<T> & SequenceProvider> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin)

首先, enumData.values()是語法錯誤。

public <T extends Enum<T>> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin);
                                                            ^^^

如您所見, enumData被聲明為Class 方法values()不存在於一個Class即使它是一個Class<? extends Enum<?>> Class<? extends Enum<?>>

解決方案:

  • 應該使用Enum<T>代替。 或者;
  • 為了紀念反射,保留Class<T> ,但將enumData.values()替換為enumData.getEnumConstants()

其次, e.getSequence()也是語法錯誤。

for(T e: enumData.values())
    ^

正如你在這里看到的, T是一個泛型類型,它擴展了Enum<T> 您可以指定T也在它的聲明中擴展Telomeres ,或者改為強制轉換:

if(e instanceof Telomeres)
   ((Telomeres) e).getSequence()

作為旁注,從您的代碼片段看來,您的函數可以在if()塊中進行壓縮,並變為:

for(T e : enumData.getEnumConstants()) {
    if(e instanceof Telomeres)
        if(chromatin.contains( ((Telomeres) e).getSequence()) ){
            return hasTranscriptionStopSite = true;

使用 getEnumConstants 的解決方案。 按照你的例子。 首先,如果您想要將不同的枚舉傳遞給 hasTranscriptionStopSite 方法,您將需要一個 Enum 接口:

public interface HasSequence {
    String getSequence();
}

枚舉實現了這個接口:

public enum Telomeres implements HasSequence {

    TELOMERE_1("TTAGGG"), TELOMERE_2("TTCAAA");

    public String telomere;

    Telomeres(String telomere){
        this.telomere = telomere;
    }

    public String getSequence() {
        return telomere;
    }
}

現在,您既可以從枚舉中獲取值,也可以從每個枚舉值中獲取序列:

public <T extends Enum<T> & HasSequence> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin) {

    for(T e: enumData.getEnumConstants()) { // THE ONLY CHANGE IS HERE
        if(chromatin.contains(e.getSequence())){ 
        hasTranscriptionStopSite = true;
            break;
        }            
    }
    return hasTranscriptionStopSite;                
}

暫無
暫無

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

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