2010-02-08 14 views
6

मैं उपयोगिता वर्ग में विधि के लिए किसी भी enum मान पास करना चाहते हैं और एक ही enum प्रकार के एक और enum मूल्य प्राप्त करना चाहते हैं। कुछ इस तरह:जावा: विशिष्ट enums और जेनेरिक Enum <?> पैरामीटर

विधि getEnumAttribute() की
public class XMLUtils { 

    public static Enum<?> getEnumAttribute(Element element, String name, 
      Enum<?> defaultValue) { 

     if (element.hasAttribute(name)) { 
      String valueName = element.getAttribute(name); 
      // search for value 
      for (Enum<?> value: defaultValue.getClass().getEnumConstants()) 
       if (value.toString().equalsIgnoreCase(valueName)) 
        return value; 
     } 
     // not found, return default value 
     return defaultValue; 
    } 
} 

उपयोग:

// simple enum 
public enum EUploadMethod { 
    INSERT, UPDATE, DELETE 
} 

// read enum value from XML config file 
EUploadMethod method = XMLUtils.getEnumAttribute(element, "method", 
     EUploadMethod.INSERT); 

इस कोड को पूरी तरह कार्यात्मक है, ग्रहण संकलित करता है तथा चेतावनी या त्रुटियों के बिना इसे चलाता है और यह एक आकर्षण की तरह काम करता है।

लेकिन जब मैं साफ और Maven2 द्वारा कमांड लाइन से परियोजना संकलन, यह है, जहां getEnumAttribute बुलाया लाइन पर त्रुटि के साथ विफल:

:

$ mvn clean compile 
.... 
[ERROR] /home/.... DataUploader.java:[173,53] inconvertible types 
found : java.lang.Enum<capture#414 of ?> 
required: .....DataUploader.EUploadMethod 

मैं या तो ग्रहण और Maven में सूर्य JDK 1.6 का उपयोग कर रहा

$ mvn -version 
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200) 
Java version: 1.6.0_14 
Java home: /usr/lib/jvm/java-6-sun-1.6.0.14/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "linux" version: "2.6.27-17-generic" arch: "i386" Family: "unix" 

सवाल:

  1. यह कोड संकलित करने योग्य है और ग्रहण में कार्यात्मक है, और संकलित मेवेन में विफल रहता है, जहां तक ​​मुझे एक ही जावैक कंपाइलर पता है?

  2. जेनेरिक Enum<?> पैरामीटर के लिए विशिष्ट मानकों को पारित करने में क्या गलत है? विशेष रूप से जब यह जेनरिक की बात आती है

धन्यवाद,

मार्टिन Schayna

+0

मैंने मैवेन -2 टैग हटा दिया क्योंकि यह एक मैवेन संबंधित मुद्दा नहीं है बल्कि एक शुद्ध ग्रहण/जावैक कंपाइलर मुद्दा है। –

+0

ग्रहण में जेडीके से स्वतंत्र, इसका स्वयं का कंपाइलर है। यही कारण है कि इसे जेडीके स्थापित करने की आवश्यकता नहीं है (आपको केवल जेआरई की आवश्यकता है।) – finnw

उत्तर

9
  1. ग्रहण संकलक और javac, कुछ मतभेद हैं। ऐसी मान्यता है कि ग्रहण के सही है, लेकिन है कि कोई फर्क नहीं पड़ता :)

  2. प्रयास करें

    public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name, 
        Enum<T> defaultValue) { 
        ... 
    } 
    
+0

धन्यवाद, आप बिल्कुल सही हैं, आदमी! आपके वैकल्पिक विधि हस्ताक्षर के साथ मेरा स्रोत compclable या तो ग्रहण और मेवेन में है। मैं दोनों कंपाइलरों के बीच अंतर से थोड़ा उलझन में हूं ... वैसे भी, धन्यवाद! – mschayna

+2

बाधा '<टी Enum >> सही है लेकिन आप' टी' (वास्तविक enum प्रकार) 'Enum 'के बजाय वापसी प्रकार बना सकते हैं जो' टी' का एक सार सुपरक्लास है। – finnw

1

मैं ग्रहण के किस संस्करण का उपयोग कर रहे पता नहीं है, लेकिन मुझे लगता है कि यह गलत है यहाँ। मेरा संस्करण उसी त्रुटि को रिपोर्ट करता है जिसे आप मेवेन के साथ देख रहे हैं, जो एक वास्तविक त्रुटि प्रतीत होता है।

समस्या यह है कि आपके पास getEnumAttribute() के हस्ताक्षर में दो वाइल्डकार्ड ("?") हैं लेकिन कोई बाधा नहीं है (न ही यह एक बनाना संभव है) जो उन्हें समान होने के लिए मजबूर करता है। तो एक ग्राहक डिफ़ॉल्ट प्रकार के रूप में एक प्रकार के enum में गुजर सकता है और बदले में एक अलग प्रकार की enum प्राप्त कर सकते हैं।

आप एक नामित प्रकार पैरामीटर के साथ दोनों वाइल्डकार्ड की जगह बुला कोड में त्रुटि को खत्म कर सकते हैं:

class XMLUtils { 

    @SuppressWarnings("unchecked") 
    public static <E extends Enum<E>> E getEnumAttribute(Element element, String name, 
      E defaultValue) { 

     if (element.hasAttribute(name)) { 
      String valueName = element.getAttribute(name); 
      // search for value 
      for (Enum<?> value: defaultValue.getClass().getEnumConstants()) 
       if (value.toString().equalsIgnoreCase(valueName)) 
        return (E) value; 
     } 
     // not found, return default value 
     return defaultValue; 
    } 
} 

लेकिन मैं इसे अनियंत्रित कलाकारों को खत्म किया जा सकता है नहीं लगता है, क्योंकि Enum<E>.getClass() रिटर्न Class<Enum<?>> तो संकलक enumConstants सरणी में किस प्रकार का enum निहित नहीं है बता सकते हैं।

+0

सैद्धांतिक विश्लेषण के लिए धन्यवाद, दो अलग-अलग enum प्रकारों के लिए especialy "अवांछित" सहिष्णुता (एक 'डिफ़ॉल्ट वैल्यू' के लिए एक और परिणाम के लिए एक) महत्वपूर्ण है, लेकिन मेरे मामले में यह शायद कई गलतियों का कारण नहीं बनता है। पूर्णता के लिए: मैं ग्रहण 3.5.1 का उपयोग कर रहा हूं। – mschayna

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