Die folgenden Code kompiliert (und führt Tests wie erwartet) in Eclipse:Discrepancy zwischen Eclipse-Compiler und Javac - Aufzählungen, Schnittstellen und generics
import java.util.EnumSet;
public class EnumTest {
static enum Cloneables implements Cloneable {
One, Two, Three;
}
public <T extends Cloneable> T getOne(Class enumType) {
EnumSet<? extends T> set = EnumSet.allOf(enumType);
return set.iterator().next();
}
}
jedoch mit dem Kompilieren entweder javac
(JDK 7) direkt oder über Maven schlägt mit dem folgenden Fehler:
type argument ? extends T is not within bounds of type-variable E
Um ehrlich zu sein, die Komplexität von Aufzählungen + Schnittstellen + Typ-Parameter (Generika) alle im Spiel auf einmal warf mich ab, als ich den Code schrieb, aber ich dachte, ich hatte es endlich richtig gemacht.
Ziel Aufruf Code wie diesen zu schreiben ist:
Cloneable something = enumTest.getOne(Cloneables.class);
Zum Beispiel in Eclipse den folgenden Test erstellt und übergibt:
@Test
public void testGetFirst() {
assertSame(Cloneables.One, getOne(Cloneables.class));
}
irgendwelche Hinweise über die "korrekt" Eclipse- oder javac, werden geschätzt.
auch eine Beratung über alternative Möglichkeiten geschätzt ist, die Idee umzusetzen: nehmen Sie eine Klasse als Methode param, die in EnumSet.allOf()
verwendet werden können, und dass bestimmt auch die Art der Enum-Objekte in den EnumSet
By the way , bemühe dich nicht, den Zweck dieser Methode zu kritisieren; Ich habe es von nützlicheren/sinnvolleren Code heruntergesetzt. Ich bin nicht daran interessiert, die Vorzüge des "Findens des ersten Elements von einem Enum-Typ" zu diskutieren - das ist nicht der Sinn dieser Frage.
Es scheint, dass dies in javac (JDK 1.7.0_60) ein Fehler sein kann. Die akzeptierte Antwort unten ist ein Workaround (und tatsächlich sauberer Code). Siehe die detaillierte Analyse unter https://bugs.eclipse.org/bugs/show_bug.cgi?id=456459#c7 –