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

时间:2014-07-13 01:45:39

标签: 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 telomere;
    }
}

我正在尝试创建循环所有enum类值的方法(使用enum参数)并检查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;                
}

如果有任何建议如何解决这个问题或纠正我的观点,我将非常感激。

3 个答案:

答案 0 :(得分:5)

要从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)

答案 1 :(得分:2)

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

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

如您所见,enumData被声明为Class。方法values()Class中不存在,即使它是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;

答案 2 :(得分:1)

使用getEnumConstants的解决方案。按照您的示例。首先,如果想要的是将不同的枚举传递给方法hasTranscriptionStopSite,则将需要一个用于枚举的接口:

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;                
}