Java: bestimmte Enumerationen und generischen Enum<?> - Parameter
Möchte ich weitergeben jeder enum-Wert-Methode in der utility-Klasse und erhalten ein weiteres enum-Wert des gleichen enum-Typ. So etwas wie dieses:
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;
}
}
Verwendung der Methode getEnumAttribute()
:
//simple enum
public enum EUploadMethod {
INSERT, UPDATE, DELETE
}
//read enum value from XML config file
EUploadMethod method = XMLUtils.getEnumAttribute(element, "method",
EUploadMethod.INSERT);
Dieser code ist voll funktionsfähig, Eclipse kompiliert und läuft es ohne Warnungen oder Fehler, und es funktioniert wie ein Charme.
Aber wenn ich sauber und Projekt kompilieren von der Kommandozeile durch Maven2, es schlägt fehl mit Fehler on line, wo ist getEnumAttribute
genannt:
$ mvn clean compile
....
[ERROR] /home/.... DataUploader.java:[173,53] inconvertible types
found : java.lang.Enum<capture#414 of ?>
required: .....DataUploader.EUploadMethod
Ich bin Sun JDK 1.6 verwenden, entweder Eclipse und Maven:
$ 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"
Fragen:
-
Warum dieser code ist kompilierbar und funktional in Eclipse, und kompilieren Sie scheitert in Maven, die soweit ich weiß denselben javac-compiler?
-
Was ist Los mit übergeben bestimmte enums Generika
Enum<?>
Parameter?
Dank,
Martin Schayna
- Ich entfernte die maven-2-tag, da dies nicht ein maven-bezogene Frage, sondern eine Reine eclipse/javac-compiler-Problem.
- Eclipse hat einen eigenen compiler, unabhängig von der JDK. Deshalb ist es nicht erforderlich, dass das JDK installiert werden (Sie müssen nur die JRE.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eclipse-compiler und javac-Unterschiede, vor allem, wenn es um Generika. Es wird angenommen, dass eclipse ist richtig, aber das spielt keine Rolle 🙂
Versuchen
<T extends Enum<T>>
ist richtig, aber Sie machen könnteT
(die tatsächlichen enum-Typ) die Rückkehr der Art, anstattEnum<T>
was ist eine abstrakte Oberklasse vonT
.Ich weiß nicht, welche version von Eclipse verwendest, aber ich denke, es ist falsch hier. Meine version meldet den gleichen Fehler, dass Sie sehen, mit Maven, das scheint ein echter Fehler.
Das problem ist, dass Sie zwei wildcards (
"?"
) in der SignaturgetEnumAttribute()
aber es gibt keine Einschränkung (noch ist es möglich, eines zu erstellen), die Sie zwingt, das gleiche zu sein. So ein client passieren könnte, in eine enum einen Typ als default-Wert und erhalten Sie eine enum eines anderen Typs zurück.Können Sie beseitigen die Fehler im aufrufenden code durch ersetzen beide Varianten mit einem benannten parameter Typ:
Aber ich glaube nicht, dass es möglich ist, zu beseitigen, die unchecked cast, weil
Enum<E>.getClass()
zurückClass<Enum<?>>
damit der compiler kann nicht sagen, welche Art von enum ist auch enthalten in derenumConstants
array.defaultValue
und eine für das Ergebnis) ist wichtig, aber in meinem Fall wäre es wahrscheinlich nicht dazu führen, viele Fehler. Der Vollständigkeit halber: ich bin mit Eclipse 3.5.1.