[英]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.