2016-07-22 8 views
7

होने के लिए लागू करना मैं एक सेट के अंदर App नामक एक प्रकार को स्टोर करना चाहता हूं। App को एक enum होना आवश्यक है जो App इंटरफ़ेस लागू करता है।एक इंटरफ़ेस के कार्यान्वयन को enum

Set<App> myApps; 

मैं बहुत की तरह इंटरफ़ेस

class MyClass implements Application<MyClass> {} 

परिभाषित किया है ...

interface App<T extends Enum<T>> {} 

यह लगभग काम कर रहा है, उदाहरण के लिए, यदि आप ऐसा नहीं कर सकते हैं ... हालांकि, आप कर सकते हैं ऐसा करें ...

enum MyEnum implements Application<MyEnum> {} 
class Myclass implements Application<MyEnum> {} 

जो गलत है। मैं केवल इस इंटरफेस को लागू करने में सक्षम होना चाहता हूं, मैं इसे कैसे लागू कर सकता हूं?

+0

और वास्तव में क्या त्रुटि संदेश आप संकलक से मिलता है? अपनी घोषणाओं के लगातार, * सभी * को दिखाने के लिए कृपया अपनी पोस्ट संपादित करें। –

+1

@ माइकरोबिन्सन को उन्हें एक त्रुटि संदेश नहीं मिला है, यही समस्या है - वह चाहता है कि संकलक अंतिम घोषणा के बारे में शिकायत करे। ;) – Thomas

+0

@ माइकरोबिन्सन फिर से प्रश्न पढ़ते हैं। कंपाइलर से कोई त्रुटि नहीं है। ओपी सिर्फ कार्यान्वयन प्रतिबंधित करना चाहता है। – Mena

उत्तर

11

एक विधि आप सेट में तत्वों को जोड़ने, लेकिन उस पैरामीटर के लिए एक बाधा का उपयोग करने की अनुमति देता है कि निर्धारित करें ...

public <E extends Enum<E> & IMyInterface> void addToSet(final E value) { } 
कि

addToSet(MyEnum.K) will compile 

लेकिन

addToSet(new Myclass()) will NOT compile 
के बाद

अब

+2

अच्छा कामकाज। – Mena

+1

तो यह एक इंटरफ़ेस घोषणा के बजाए एक विधि घोषणा के भाग के अलावा छोड़कर एक ही प्रकार पैरामीटर सामान है - साफ :) – Ogen

+0

मेरे सेट का प्रकार क्या होगा? – Ogen

1

AFAIK एक इंटरफ़ेस के कार्यान्वयन को लागू करना संभव नहीं है ताकि कुछ गुण हो जैसे कि enum।

हालांकि, अपने कोड के आधार पर और कैसे आपको लगता है कि इंटरफ़ेस का उपयोग आप इसे कठिन बना सकते हैं किसी implementor एक enum बनाने के लिए नहीं करने के लिए:

  • आवश्यकता TApp<T> को लागू करने के रूप में अच्छी तरह के लिए किसी भी enum गुजर रोकने के लिए वर्ग घोषणा (यानी App<T extends Enum<T> & App<T>>)
  • उपयोग अतिरिक्त सीमाओं जब संभव (ΦXocę 웃 Пepeúpa के जवाब देखें)
  • , विधियों कि पहले से ही इस तरह के Enumname() रूप से लागू किया जाता है जोड़े ordinal() , getDeclaringClass() आदि
  • App<T ...> विस्तार Comparable<T> करते हैं।
  • जब संभव हो तो उस संपत्ति को रनटाइम पर देखने के लिए getClass().isEnum() पर कॉल करें। यह आदर्श नहीं है लेकिन ऐसे ही समाधान हैं जिनका उपयोग आमतौर पर Collections.unmodifiableSet() जैसे किया जाता है।
संबंधित मुद्दे