2010-02-08 18 views
6

Enum değeri sınıfındaki yönteme geçmek ve aynı enum türünde başka bir enum değeri almak istiyorum. Böyle bir şey: yönteminin getEnumAttribute() aitJava: belirli enumlar ve jenerik Enum <?> parametreler

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; 
    } 
} 

Kullanım:

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

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

Bu kod tamamen işlevseldir, Eclipse derler ve uyarılara veya hatalar olmadan çalışır ve bir cazibe gibi çalışır.

Ama temizleyip Maven2 tarafından komut satırından projeyi derlemek, bunun getEnumAttribute denir nerede hattında hata ile başarısız:

: Eclipse ve Maven ya Sun JDK 1.6 kullanıyorum

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

$ 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" 

Sorular:

  1. Bu kod neden Eclipse'da işlevsel olup, aynı javac derleyicisini bildiğim kadarıyla Maven'da hatalarını derler?

  2. Belirli enumları jenerik Enum<?> parametrelerine geçirmenin nesi yanlış? o jenerik söz konusu olduğunda

sayesinde

Martin Schayna

+0

Maven-2 etiketini kaldırdık, çünkü bu bir maven ile ilgili sorun değil, bir salt eclipse/javac derleyici sorunudur. –

+0

Eclipse, JDK'dan bağımsız olarak kendi derleyicisine sahiptir. Bu yüzden JDK'nın yüklenmesi gerekmiyor (sadece JRE'ye ihtiyacınız var.) – finnw

cevap

9
  1. Eclipse derleyici ve Javac, bazı farklılıklar var. Tutulma doğru olduğuna inanılmaktadır, ama bu :)

  2. matter Ben kullandığınız Eclipse hangi sürümünü bilmiyorum ama yanlış olduğunu düşünüyorum

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

Teşekkürler, kesinlikle haklısınız dostum! Alternatif yöntem imzanızla, Eclipse ve Maven'de kaynağımla karşılaştırılabilir kaynak. Her iki derleyici arasındaki farklar biraz karıştı ... Neyse, tekrar teşekkürler! – mschayna

+2

'>' sınırlaması doğrudur, ancak 'T' (gerçek enum türü) 'T' nin soyut bir üst sınıfı olan Enum 'yerine dönüş türünü yapabilirsiniz. – finnw

1

deneyin gelmez İşte. Sürümüm, gerçek bir hata gibi görünen Maven ile gördüğünüz aynı hatayı bildiriyor. Sorun, getEnumAttribute() imzasında iki joker karakterin ("?") sahip olmanızdır, ancak onları aynı olmaya zorlayan bir kısıtlama (veya bir tane yaratılması mümkün değildir) yoktur. Dolayısıyla, bir müşteri varsayılan tür olarak bir türdeki bir numarada geçebilir ve karşılığında farklı türde bir numara alabilir.

adlandırılmış bir tür parametresi ile her iki joker değiştirerek arama kodunda hatayı ortadan kaldırabilir:

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; 
    } 
} 

Ama kontrolsüz döküm ortadan kaldırmak mümkün olduğunu sanmıyorum Enum<E>.getClass() getiri Class<Enum<?>> çünkü böylece derleyici, enumConstants dizisinde hangi enum öğesinin bulunduğunu söyleyemez.

+0

Kuramsal analiz için teşekkür ederiz, iki farklı enum türüne ("defaultValue" ve sonuç için bir tane için) özel "istenmeyen" tolerans önemlidir, ancak benim durumumda muhtemelen birçok hataya neden olmaz. Tamlık için: Eclipse 3.5.1 kullanıyorum. – mschayna

İlgili konular