我有多个枚举。这是一个例子:
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;
}
如果有任何建议如何解决这个问题或纠正我的观点,我将非常感激。
答案 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;
}