2010-06-20 20 views
8

मुझे कुछ पुराना कमांड लाइन तर्क पार्सिंग कोड मिला है जिसे मैंने 4 साल पहले जावा 5 के लिए लिखा था, और यह जावा 6 में संकलित नहीं होगा, जेनेरिकों को कैसे संभाला जाता है और/या कुछ लाइब्रेरी कक्षाएं सामान्य हैं या नहीं। इसे ठीक करने की कोशिश करते समय, मैं निम्नलिखित समस्या में आया; चूंकि मैंने जावा को छुआ है, इसलिए 4 साल हो चुके हैं और मैं कभी भी जेनेरिक के साथ शुरुआत करने के लिए विशेषज्ञ नहीं था, यह मुझे छेड़छाड़ करने का तरीका है।जेनेरिक विधि प्रकारों के साथ जावा जेनेरिक फ़ील्ड प्रकारों के साथ विशिष्ट नहीं हो सकता है?

लाइब्रेरी मुझे यह निर्दिष्ट करने की अनुमति देती है कि कुछ कमांड लाइन विकल्प enums के अनुरूप हैं। ऐसा करने के लिए, इस विकल्प से संबंधित ArgumentSpecification ऑब्जेक्ट क्लास ऑब्जेक्ट को पकड़ना चाहता है, जिसे हम enum क्लास के अनुरूप "enumClass" कहते हैं। दुर्भाग्यवश, मुझे लगता है कि वास्तविक एनम कक्षाओं के अनुरूप कक्षा वस्तुओं को रखने के लिए उस क्षेत्र के प्रकार को सही ढंग से लिखना कैसा लगता है। मुझे लगता है कि मैं जो चाहता हूं वह कुछ है:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error 

लेकिन इस पर कंपाइलर बारफ।

protected Class<? extends Enum<?>> enumClass; 

लेकिन यह है कि:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works" 

मैं बजाय क्षेत्र के लिए इस का उपयोग कर प्रयास कर सकते हैं: दूसरी ओर, संकलक तरीकों है कि वापसी मान और/या मापदंडों कि जिस तरह से निर्दिष्ट के साथ पूरी तरह से खुश है वास्तव में काम नहीं करता है ... कोड के अन्य हिस्सों को "<E extends Enum<E>>" प्रकार की आवश्यकता है ताकि वे वास्तव में ई पर मिल सकें, और यह "<? extends Enum<?>>" के साथ मेल नहीं खा रहा है, क्योंकि मुझे इस तरह की कंपाइलर त्रुटियां मिलती हैं:

Bound mismatch: The generic method checkedEnumFromString(Class<E>, String) of type EnumUtil is not applicable for the arguments 
(Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded 
parameter <E extends Enum<E>> 

क्या सही प्रकार के साथ फ़ील्ड घोषित करने का कोई तरीका है कि मुझे याद आ रही है? यदि ऐसा है, तो ये क्या है? यदि नहीं, तो क्या यह जावा के बहुत ही टूटे हुए तरीकों से उन तरीकों को घोषित करने में सक्षम नहीं है जिन्हें आप फ़ील्ड के लिए नहीं कर सकते? या क्या मैं इतनी भयानक उलझन में हूं कि मेरे प्रश्न से शुरू करने का कोई मतलब नहीं है?

class MyClass<E extends Enum<E>> { 
    Class<E> enumClass; 
} 

उत्तर

9

आप स्पष्ट पैरामीटर E उस तरह के साथ एक क्षेत्र परिभाषित करने की जरूरत है, तो आप प्रकार है जिसमें क्षेत्र में घोषित किया जाता है parameterize करने के लिए इस तरह संकलित हो सकता है कुछ। एक "सामान्य क्षेत्र" घोषित करने के लिए - एक जिसमें एक प्रकार का पैरामीटर स्वयं होता है। जावा में ऐसी कोई अवधारणा नहीं है - केवल विधियों और प्रकार टाइप पैरामीटर पेश कर सकते हैं।

पॉलीजेनेलब्रिकेंट्स कहते हैं, आप प्रकार में एक अतिरिक्त प्रकार पैरामीटर पेश कर सकते हैं, और उस क्षेत्र के प्रकार के रूप में उपयोग कर सकते हैं।

+2

मुझे इससे डर था ... उह। मुझे लगता है कि यह वास्तव में स्वीकार करेगा कि जावा के प्रकार की प्रणाली को मंद कर दिया गया है (धन्यवाद, टाइप मिटाएं!) और "क्लास एनम क्लास;" का उपयोग करें। उदार मिर्चिंग @ShutTheHellUp ("अनचेक") के संयोजन के साथ; हालांकि प्रतिक्रिया के लिए धन्यवाद। –

7

आप कोशिश कर रहे हैं:

संबंधित मुद्दे