2009-07-01 2 views
39

मैं 100% यकीन नहीं है कि यह एक अच्छा विचार है, लेकिन मैं आज कुछ कोड से टकरा गई, जो वर्तमान में लागू हो जाता है:मुझे एक जेनेरिक पैरामीटर की आवश्यकता कैसे हो सकती है जो एक इंटरफ़ेस लागू करता है?

class MyWidget <T extends Enum<T> > { 
    MyWidget(Map<T, Integer> valueMap) { 
    mValueMap = valueMap; 
    } 

    Map<T, Integer> mValueMap; 
} 

जहां MyWidget तो तरीकों कि mValueMap का उपयोग प्रदान करता है परिवर्तित करने के लिए Enum पारित कर दिया-इन Integer से/से।

क्या मैं इस refactor करने के लिए कोशिश कर रहा था कर विचार कर रहा था, ताकि मैं अपने गणन घोषित चाहते हैं:

interface MyInterface { 
    public Integer getValue(); 
} 

enum MyEnum implements MyInterface { 
    foo, bar; 
    public Integer getValue() { 
    return ordinal(); 
    } 
} 

और मैं तो कुछ है कि इस तरह अस्पष्ट देखा में MyWidget के पुनर्लेखन के लिए सक्षम होगा:

public class MyWidget<T extends Enum<T> extends MyInterface> { 
    ... 
} 

और फिर MyWidget भीतर T प्रकार की वस्तुओं पर MyInterface से getValue() विधि कॉल करने में सक्षम होगा। समस्या यह है कि, "<T extends Enum<T> extends MyInterface>" वैध वाक्यविन्यास नहीं है। क्या इसे खींचने का कोई तरीका है?

मैं सिर्फ MyWidget<T extends MyInterface> नहीं चाहता, क्योंकि यह भी महत्वपूर्ण है कि टी एक गणना हो।

अग्रिम धन्यवाद!

उत्तर

77

उपयोग एक '&' के बजाय:

public class MyWidget<T extends Enum<T> & MyInterface> { 
    ... 
} 

JLS कॉल यह एक "चौराहे प्रकार", लेकिन मैं जावा ट्यूटोरियल में यह का कोई जिक्र नहीं मिल सकता है। मैं बस इतना कहूंगा कि यह वही करता है जो आप चाहते थे कि "extends" करेगा।

इसके अलावा, मुझे यह उल्लेख करना चाहिए कि आपके पास चौराहे के प्रकार में जितने चाहें उतने प्रकार हो सकते हैं। तो अगर आप चाहते हैं तो आप कर सकता है:

public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> { 
    ... 
} 

[नोट: इस कोड नमूना Cloneable इंटरफ़ेस का समर्थन के रूप में नहीं लगाया जाना चाहिए; यह समय में केवल काम था]

+0

और वाक्यविन्यास साफ है, लेकिन मुझे लगता है कि इसका उपयोग आमतौर पर एक कोड गंध में बदल जाता है, और यह संकेत है कि आपके मॉडल के साथ कुछ सही नहीं है। – skaffman

+2

मैं सहमत हूं (मुझे लगता है कि मैंने इसे एक या दो बार इस्तेमाल किया है, अगर ऐसा है)। लेकिन एक इंटरफ़ेस को लागू करने वाले enums के मामले में, मुझे लगता है कि यह उचित है। –

+0

बढ़िया! यही वही है जो मैं ढूंढ रहा था। बहुत धन्यवाद! – Sbodd

1

JSR 203 (नई नई आईओ) के लिए JDK 7 enums कि इंटरफेस (उदाहरण के लिए: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption.html) को लागू के उपयोग का एक बहुत कर रही है सामान। अपने आप में कुछ लचीलेपन की तुलना में अनुमति देने के लिए एनम विकल्पों के भविष्य के अतिरिक्त सेट के लिए भविष्य। तो यह एक व्यवहार्य दृष्टिकोण है और जाहिर है कि एक बड़े सूर्य परियोजना में बहुत सारे विचारों के बाद चुना गया था।

+0

साफ।उम्मीद है कि मेरे दाढ़ी ग्रे हो जाने से पहले जावा 7 दिखाई देगा। – skaffman

+0

इस सामान का उपयोग करने वाले कोड की एक छोटी राशि लिखने से, मेरी धारणा यह है कि यह थोड़ा अजीब है। यह नहीं कह सकता कि मैंने इसे कहीं और देखा है। नाम में 7 के साथ कुछ 2010 में रिलीज होगा, मुझे पूरा यकीन है। चाहे यह जेसीपी द्वारा अनुमोदित "जावा 7" होगा, मुझे नहीं पता। केवल ओरेकल जवाब दे सकता है ... –