如果枚举类是Java方法中的参数,如何获取枚举值?

如果枚举类是Java方法中的参数,如何获取枚举值?,java,methods,parameters,enums,Java,Methods,Parameters,Enums,我有多个枚举。以下是一个例子: public enum Telomeres { TELOMERE_1("TTAGGG"), TELOMERE_2("TTCAAA"); public String telomere; Telomeres(String telomere){ this.telomere = telomere; } public String getSequence() { return telome

我有多个枚举。以下是一个例子:

   public enum Telomeres {

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

    public String telomere;

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

    public String getSequence() {
        return telomere;
    }
}
我试图创建一个方法(使用enum参数),该方法循环枚举类的所有值,并检查字符串是否至少包含其中一个值。不幸的是,我无法获取枚举值来检查字符串是否包含它们。下面是说明问题的代码

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;                
}
public boolean hasTranscriptionStopSite(类枚举数据,字符串染色质){
对于(te:enumData.values()){//我在这里得到错误
如果(chromatin.contains(e.getSequence()){//我这里也有问题
hasTranscriptionStopSite=真;
打破
}            
}
返回表层土;
}

如果您能为我提供解决此问题的建议或纠正我的观点,我将不胜感激。

要从
对象获取枚举值,您可以使用

如果您想访问
getSequence()
函数。您应该使用一个接口:

public interface SequenceProvider {
    String getSequence();
}

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

    @Override
    public String getSequence() {
        return telomere;
    }
}
public <T extends Enum<T> & SequenceProvider> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin)
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;
    }
}
并更改
hasTranscriptionStopSite(Class,String)
的签名,以保证
T
扩展接口:

public interface SequenceProvider {
    String getSequence();
}

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

    @Override
    public String getSequence() {
        return telomere;
    }
}
public <T extends Enum<T> & SequenceProvider> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin)
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 boolean hasTranscriptionStopSite(类枚举数据,字符串染色质)

首先,
enumData.values()
是语法错误

public <T extends Enum<T>> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin);
                                                            ^^^
for(T e: enumData.values())
    ^
正如您在这里看到的,
T
是扩展
Enum
的泛型类型。您可以在声明中指定
T
也扩展
端粒
,或者改为强制转换:

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,则需要为枚举提供一个接口:

public interface HasSequence {
    String getSequence();
}
枚举实现此接口:

public interface SequenceProvider {
    String getSequence();
}

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

    @Override
    public String getSequence() {
        return telomere;
    }
}
public <T extends Enum<T> & SequenceProvider> boolean hasTranscriptionStopSite(Class<T> enumData, String chromatin)
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;                
}
public boolean hasTranscriptionStopSite(类枚举数据,字符串染色质){
对于(te:enumData.getEnumConstants()){//唯一的更改在这里
if(染色质包含(e.getSequence()){
hasTranscriptionStopSite=真;
打破
}            
}
返回表层土;
}

谢谢,您的解释也很有效,它帮助我理解了问题的原理。