2015-01-11 12 views
5

मैं एक सामान्य विधि है कि एक घिरे पैरामीटर कि Enum फैली लेता लिखने के लिए चाहते हैं उपयोग नहीं कर सकते। उदाहरण के लिए, अगर मैं एक Enum है इस प्रकार है:जेनेरिक विधि का विस्तार Enum पैरामीटर - मूल्यों() विधि

public enum InputFlags{ 
    ONE (0000001), 
    TWO (0000002), 
    THREE (00000004); 

    public final int value; 

    InputFlags(int value){ 
     this.value = value; 
    } 
} 

मैं तो निम्न कर सकते हैं:

for (InputFlags ifg : InputFlags.values()){ 
      // Do something with ifg 
} 

लेकिन अगर मैं एक सामान्य विधि जिसका वापसी पैरामीटर घिरा है में ऊपर करने की कोशिश,

public static <T extends Enum> T getFlags(int f){ 
     T.values(); // NOT allowed, even though I have bounded by extending Enum. 
} 

ऐसा लगता है जैसे कि मैं सामान्य विधि में values() उपयोग नहीं कर सकते: मैं values() विधि का उपयोग नहीं कर सकते हैं। क्या यह Enums की एक विशिष्टता है या इस के आसपास एक रास्ता है?

+0

लगता है जैसे आप पुनर्रचना कर रहे हैं [ 'EnumSet'] (http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html)। – Holger

उत्तर

0

यह static विधियों की विशिष्टता है। static विधियों पर लागू होने वाले इंटरफ़ेस को परिभाषित करने के लिए, जेनेरिक या अन्यथा जावा के साथ जावा में कोई रास्ता नहीं है, यानी। कि एक वर्ग को static विधि को लागू/लागू करना चाहिए।

इसके अलावा, टाइप (अन्य चीजों के साथ) टाइप करें T को static विधि आमंत्रण अभिव्यक्ति में एक प्रकार के नाम के रूप में उपयोग करने से रोकता है।

+0

यदि मैं 'स्थिर' कीवर्ड लेता हूं तो मुझे अभी भी वही समस्या मिलती है। – Kerry

+0

@ केरी 'मान'' स्थिर 'विधि है, न कि आपके' getFlags'। –

+0

ठीक है, मैंने आपको 'स्थिर 'कीवर्ड के बारे में गलत समझा। मुझे आपके उत्तरों के बारे में सोचना चाहिए क्योंकि मैं इसे अपने सिर में नहीं कर सकता।मेरे (सरल) दृश्य में, जैसा कि मैंने जेनेरिक विधि में पैरामीटर को बाध्य किया था, तो निश्चित रूप से सभी enum विधियों, स्थिर या गैर स्थैतिक उपलब्ध होना चाहिए। – Kerry

1

values() एक स्थिर विधि InputFlags कक्षा में संकलक द्वारा डाला है। इस प्रकार, T.values() का उपयोग करना संभव नहीं है, खासकर जब टी एक सामान्य प्रकार है। हालांकि, अगर आप Class टी की ऑब्जेक्ट प्राप्त कर सकते हैं (आमतौर पर getClass() के माध्यम से, या इसे getFlags(int f, Class<T> clazz) पर पास करके), तो आप उस ऑब्जेक्ट पर Class#getEnumConstants() का उपयोग कर सकते हैं।

+0

मैं अभी भी अपना सिर नहीं प्राप्त कर सकता हूं क्यों यह उपलब्ध नहीं होगा क्योंकि मैंने पैरामीटर को 'एनम' तक सीमित कर दिया है। मुझे लगता है कि मुझे थोड़ी देर पर विचार करने की ज़रूरत है .. – Kerry

+0

मूल्य() एनम के प्रत्येक उप-वर्ग में एक स्थिर विधि है, लेकिन एनम में एक विधि नहीं है। इस प्रकार, संकलक एनम के सदस्य के रूप में विधि नहीं ढूंढ सकता है। इसके अलावा, एक स्थिर विधि का स्थान (यानी, जिस वर्ग का यह सदस्य है) संकलन समय पर हल किया गया है, जो यहां नहीं किया जा सकता है। – Clashsoft

8

values() जावा में एक बहुत ही अजीब चीज है। Enum - values() के लिए प्रलेखन में देखें, यहां तक ​​कि वहां भी नहीं है! values()Enum की कोई विधि नहीं है। इसके बजाय static विधि values() नामक विधि को Enum तक विस्तारित प्रत्येक वर्ग में जोड़ा गया है। लेकिन एक enum के लिए values() विधि एक और enum में values() विधि से अलग है।

तथ्य T extends Enum इसका मतलब है कि अगर t टाइप T है आप t पर Enum से तरीकों उदाहरण कॉल कर सकते हैं। आप की static तरीकों Enum (और वैसे भी आप, values() मौजूद नहीं है हो सकता है, भले ही!) कॉल नहीं कर सकते

values() ही उपयोगी है जब आप वास्तविक enum नाम से जानते हैं। इसका उपयोग तब नहीं किया जा सकता जब आपके पास केवल एक प्रकार पैरामीटर T हो।

इस समस्या के आसपास Class ऑब्जेक्ट को पास करना है। इस तरह:

public static <T extends Enum<T>> T getFlags(Class<T> clazz, int f){ 
    T[] array = clazz.getEnumConstants(); // This is how you can get an array. 
    Set<T> set = EnumSet.allOf(clazz);  // This is how you can get a Set.  
} 
संबंधित मुद्दे