2012-08-10 15 views
7

मैं की तरह enums कि एक आम इंटरफ़ेस विस्तार का एक संग्रह है, तो कुछ है करने के लिए प्रयास कर रहा हूँ:Enum <? फैली इंटरफ़ेस>

interface Fooable 
{ 
    void someCommonMethod(); 
} 

enum E1 implements Fooable 
{ 
    // some enumuerations and a definition for someCommonMethod() 
} 

enum E2 implements Fooable 
{ 
    // some different enumerations and a different definition for someCommonMethod() 
} 

और फिर कहीं और लागू करने के लिए दोनों कि एक चर एक Enum है के द्वारा इस का उपयोग करें और इंटरफ़ेस लागू करता है। तो की तर्ज पर कुछ ..

bar(Enum<? extends Fooable> fe) 
{ 
    fe.ordinal(); 
    fe.someCommonMethod(); 
} 

हालांकि, अब तक मैं आदेश इंटरफ़ेस को लागू करने, यानी के रूप में यह उपचार के लिए फ़े डाली करने के लिए, लग

bar(Enum<? extends Fooable> fe) 
{ 
    fe.ordinal(); 
    ((Fooable)fe).someCommonMethod(); 
} 

और जब तक यह होना चाहिए सुरक्षित ... यह उपमहाद्वीप लगता है और मैं कुछ दिख रहा हो सकता है। बेशक अगर मैं सिर्फ फ्यूमेबल के रूप में परम को पारित करने की कोशिश करता हूं तो मैं इसे एनम के रूप में पेश करने के लिए कास्टिंग कर देता हूं और न केवल यह लाभ है कि मैं अब भी सुरक्षित नहीं हूं। निम्नलिखित देखें:

bar(Fooable fe) 
{ 
    // potentially unsafe cast! 
    ((Enum<?>)fe).ordinal(); 
    fe.someCommonMethod(); 
} 

क्या है मैं अनदेखी कर रहा हूँ या है

Enum<? extends Fooable> 
के बारे में के रूप में करीब

एक 'अच्छा' समाधान के लिए के रूप में मैं मिल जाएगा?

मैं जावा के लिए अपेक्षाकृत नया हूं और अभी भी इसे सी या सी ++ जैसे उपयोग करने की कोशिश कर रहा हूं, इसलिए यदि मैं इसे एक आंख की बजाय हथौड़ा की तरह देख रहा हूं या कुछ बेवकूफ सरल दिख रहा हूं तो इसे इंगित करने के लिए स्वतंत्र महसूस करें :)

उत्तर

1

एक विकल्प आप हा हम Enum से किसी भी तरीके को जोड़ना चाहते हैं जिसे आपको फ्यूबल पर चाहिए या एक नया इंटरफ़ेस बनाएं जो Fooable को बढ़ाता है और आपको आवश्यक एनम विधियों को जोड़ता है।

उदाहरण:

interface Fooable { 
    void someCommonMethod(); 
} 

interface FooableEnum extends Fooable { 
    int ordinal(); 
} 

enum E1 implements FooableEnum { 
    // Implement someCommonMethod. 
    // ordinal() is already implemented by default. 
} 

बार जब आप इस किया है आप FooableEnum पैरामीटर प्रकार के रूप में अपने विधि हस्ताक्षर में उपयोग कर सकते हैं और सामान्य सामान के बारे में कोई चिंता नहीं।

+0

मैंने इस बारे में सोचा था, लेकिन मुझे मूल्यों() के संबंध में इसके व्यवहार के बारे में आरक्षण था, फिर भी समीक्षा के लायक हो सकता है, हालांकि अभी मैं एक वैध आरक्षण को खत्म करने में सक्षम नहीं हूं ... – Khanmots

+0

इसके लिए एक अनावश्यक इंटरफ़ेस की आवश्यकता है । –

+0

@ माइक, मैं जितना अधिक सोचता हूं उतना ही मुझे लगता है कि यह सही रास्ता है। मेरी आवश्यकता वास्तव में नहीं है कि टाइप ** ** एक enumm है, यह है कि यह एक enum के ** व्यवहार ** है। मैंने खुद को यह भी आश्वस्त किया है कि मूल्य() चीज एक समस्या नहीं होगी और मैं मूर्खतापूर्ण था। – Khanmots

18

इसका मतलब है कि टी Enum प्रदान करता है और लागू करता Fooable:

<T extends Enum<T> & Fooable> 

इस प्रकार तरीके के रूप में लिखा जा सकता है:

<T extends Enum<T> & Fooable> void bar(T fe) { 
    fe.ordinal(); 
    fe.someCommonMethod(); 
} 
+0

हाँ, लेकिन मेरी समझ यह है कि एक सामान्य रूप से किसी विधि को पैरामीटर को परिभाषित न करने वाले सामान्य घोषित करते समय उपयोग के लिए उपयोग किया जाता है? – Khanmots

+2

@ खानमोट [तरीके स्वयं जेनेरिक हो सकते हैं] (http://docs.oracle.com/javase/tutorial/extra/generics/methods.html)। –

+0

उस दृष्टिकोण के बारे में सोचा नहीं था ... टी के साथ इंटरफ़ेस जेनेरिक होने के साथ प्रयोग किया गया था, एनम और Fooable फैलाता है, लेकिन संलग्न वर्ग को सामान्य बनाने के साथ चारों ओर पोक करना पड़ सकता है ताकि इसके सभी तरीकों में एक हो टी दोनों बाधाओं के साथ ... – Khanmots