2012-07-11 8 views
16

के रूप में कोई विधि पैरामीटर घोषित करने के लिए मेरे पास एक तरीका है जिस पर मुझे पैरामीटर के रूप में enum को पास करने की आवश्यकता है।किसी भी enum

public <T> T doSomething(SomeEnum operation, Class<T> something); 

मैं कई enums और है विधि एक आम एक है जो किसी भी enums साथ काम करना चाहिए है। किसी भी जेनेरिक एनम प्रकार को स्वीकार करने के लिए इस विधि हस्ताक्षर को लिखने का सही तरीका क्या है? मुझे पता है कि मैं इस उद्देश्य के लिए एक मार्कर इंटरफ़ेस का उपयोग कर सकता हूं, लेकिन मैं इसे जेनेरिक एनम हस्ताक्षर के साथ लिखना चाहता हूं। कृपया मुझे इस पर सलाह दें।

नीचे दिए गए के साथ बुरा विचार क्या है: (यह काम करता है लेकिन मुझे आईडीई से चेतावनियां मिलती हैं कि यह एक कच्चा प्रकार है। मैं कारण के बारे में स्पष्ट नहीं हूं)।

public void doSomething(Enum operation); 

उत्तर

30
public <E extends Enum<E>> void doSomething(E operation); 

संपादित: एक उदाहरण अपने संशोधनों के अनुसार:

public class Main { 

    public enum Day { 
     SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
     THURSDAY, FRIDAY, SATURDAY 
    } 

    public <E extends Enum<E>> E doSomething(E operation, Class<E> klazz) { 

     return operation; 
    } 

    public static void main(String[] args) { 

     new Main().doSomething(Day.FRIDAY, Day.class); 
    } 

} 

EDIT2:

अगर आप टी और अलग प्रकार के रूप में Enum की जरूरत है, तो आप की आवश्यकता होगी:

public <T, E extends Enum<E>> T doSomething(E operation, Class<T> klazz) { 
+0

पर कुछ भी नहीं जोड़ सकते हैं। कार्रवाई में इस उदाहरण के लिए EnumSet भी देखें: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html – Zarkonnen

+0

हाय, उत्तर के लिए धन्यवाद, लेकिन मैं नहीं कर सका ' इस भाग को जोड़ने के रूप में यह हस्ताक्षर मुद्दों के बारे में फिर से शिकायत करता है। मुझे खेद है कि मुझे सटीक हस्ताक्षर पोस्ट करना चाहिए था जिसे मैं ढूंढ रहा हूं। कृपया मौजूदा विधि हस्ताक्षर पर मेरा संपादन देखें जिसमें मुझे आपके द्वारा उल्लेखित किए गए जोड़ों को जोड़ने की आवश्यकता है। इस मामले में, विधि हस्ताक्षर कैसा दिखता है ??? – popcoder

+1

क्या यह आप देख रहे हैं? या टी और enum अलग प्रकार होना चाहिए? –

10

आप कर सकता है:

public void doSomething(final Enum<?> operation); 

जो कहते हैं कि यह एक enum होने की जरूरत है, लेकिन नहीं किसी भी विशिष्ट है।

+0

स्पष्टीकरण के लिए: यह मूल रूप से चेतावनी से छुटकारा पाता है (क्योंकि 'एनम' और 'एनम ' वही बात है, लेकिन कोई इसके बारे में स्पष्ट है)। –

+1

@ ब्रेंडन लोंग: 'एनम' और 'एनम ' वही बात नहीं है। जैसे आप चीजों को 'सूची' में जोड़ सकते हैं, लेकिन आप 'सूची ' – newacct

0

यह एक और अधिक साफ़ किया गया है:

public class EnumTest { 

    protected static <E extends Enum<E>> void enumValues(Class<E> enumData) { 
     for (Enum<E> enumVal: enumData.getEnumConstants()) { 
      System.out.println(enumVal.toString()); 
     } 
    } 

    public static enum TestEnum { 
     ONE, TWO, THREE; 
    } 

    public static void main(String param []) { 
     EnumTest.enumValues(EnumTest.TestEnum.class); 
    } 
}