2012-07-15 6 views
6

यह मानते हुए कि मैं एक बुनियादी enum है जैसे:जावा: जेनेरिक को स्वीकार ही enum प्रकार

public enum Color { Red, Green, Blue} 

कैसे एक एक सामान्य वर्ग है जो केवल "enum वर्गों" स्वीकार करता है लिख सकते हैं ताकि सामान्य वर्ग का एक ठोस इन्स्टेन्शियशन हो सकता है कि MyClass<Color> की तरह दिखें?

संपादित करें:

public abstract class EnumListBean<E extends Enum<E>> { 

    public List<E> getEnumList() { 
     return Arrays.asList(E.values()); 
    } 

} 

जबकि Day.values() उपलब्ध है E.values() है:

क्या एक वास्तव में क्या करना चाहते हैं सभी enum "प्रविष्टियां" लौटने सूची के रूप में एक समारोह से युक्त एक सामान्य सार वर्ग लिखना है नहीं। मैं यहाँ क्या गलत कर रहा हूँ?

+0

नहीं इसके कार्यान्वयन के एक ठोस enum प्रकार के लिए, लेकिन मनमाना enum प्रकार तक ही सीमित नहीं किया जाना चाहिए। मैं बस जो कुछ चाहता हूं उसे अधिक ठोस रूप से वर्णित करने के लिए 'डे' का उपयोग करता हूं। – Paranaix

उत्तर

5
public class EnumAcceptor<E extends Enum<E>> { 
    ... 
} 

उपयोग ई।

1

एक enum वास्तव में Enum से प्राप्त कक्षा घोषित करता है। इस तरह के रूप में, आप उपयोग कर सकते हैं: अपने वर्ग के भीतर एक प्रकार के रूप

public class MyClass<T extends Enum> { } 
+2

आप जेनेरिक और कच्चे प्रकार के मिश्रण कर रहे हैं। –

4

मूल प्रश्न के उत्तर के लिए इस्तवान देवई देखें।

अनुवर्ती के लिए, values() जैसी विधियां स्थिर विधियां हैं, इसलिए आप इसे सामान्य पैरामीटर से प्राप्त करने की कोशिश कर रहे भाग्य से बाहर हैं। एक खराब समाधान के रूप में, आप enum की Class ऑब्जेक्ट को कन्स्ट्रक्टर में पास कर सकते हैं। और Class.getEnumConstants का उपयोग करें। लेकिन आप वर्ग के बजाए कन्स्ट्रक्टर में MyEnum.values() पास कर सकते हैं, और इसलिए पूरी तरह से प्रतिबिंब से बचें। यह एक वास्तविक शर्म की बात है कि एक समझदार enum metaclass नहीं है।

0

ध्यान दें कि @ इस्तवान का समाधान केवल के को स्वीकार कर सकता है, जो ठीक है अगर आप ठीक है।

आप पारित हालांकि नहीं कर सकते enum अपने आप में एक पैरामीटर के रूप में (क्योंकि यह वास्तव में एक वस्तु समतुल्य नहीं है) आप निर्दिष्ट कर सकते है कि आप अपने निर्माता में enum की class प्राप्त करना चाहिए और उस से enum के विवरण प्राप्त:

public class EnumAcceptor<E extends Enum<E>> { 
    public EnumAcceptor(Class<E> c) { 
    // Can get at the enum constants through the class. 
    E[] es = c.getEnumConstants(); 
    } 

    enum ABC { 
    A, B, C; 
    } 

    public static void main(String args[]) { 
    EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class); 
    } 
} 
+0

ओह - @ टॉम की पोस्ट का डुप्लिकेट - क्षमा करें टॉम :( – OldCurmudgeon

0

आप प्रकार विलोपन के कारण E.values() उपयोग नहीं कर सकते - E के प्रकार के रन-टाइम में उपलब्ध नहीं है।

अपने प्रश्न में विशेष मामले के लिए, आप शायद Guava के Lists.newArrayList का उपयोग कर बेहतर कर रहे हैं:

List<Color> days = Lists.newArrayList(Color.values());