Während ich mit Lösungen für this question herumspielte, kam ich auf den folgenden Code, der einige Compilerwarnungen enthält. Eine Warnung ist:Generische Methode löst Sicherheitsfehler aus - warum?
Type safety: The expression of type Test.EntityCollection needs unchecked conversion to conform to Test.EntityCollection<Test.Entity>
ich nicht ganz verstehen, warum diese Warnung wird angezeigt. Wenn ich einen Class<M>
Typ übergebe und deklariere, dass die Methode EntityCollection<M>
zurückgibt, warum tue ich nicht genug, um den (Java 7) Compiler davon zu überzeugen, dass der korrekte Typ zurückgegeben wird?
static class Entity {
}
static class EntityCollection<E extends Entity> {
private EntityCollection(HashMap<?, E> map) {
}
public static <T extends HashMap<?, M>, M extends Entity> EntityCollection<M> getInstance(
Class<T> mapType, Class<M> entityType)
throws ReflectiveOperationException {
T map = mapType.getConstructor().newInstance();
return new EntityCollection<M>(map);
}
}
public static void main(String[] args) throws Exception {
// both compiler warnings are on the line below:
EntityCollection<Entity> collection = EntityCollection.getInstance(
LinkedHashMap.class, Entity.class);
}
Bonuspunkte, wenn jemand den Code verbessern kann, um Warnungen vollständig zu vermeiden. Ich habe es eine Weile lang angeguckt und habe mir keine Möglichkeit ausgedacht, die Warnungen zu verringern.
Hmm, mit ein wenig mehr Experimente kann ich nicht bekommen entweder Java 7 oder Java 8, um dagegen zu protestieren (außer einem "Sie könnten Diamantschlussfolgerung verwenden" auf dem 'return new EntityCollection (Karte)'). Ansonsten ist es sehr glücklich. Ich benutze Netbeans –
@RichardTingle Ich kann Java 1.8.0_05 bekommen, um mir Warnungen zu geben, wenn ich mit 'javac -Xlint: alle' in der Befehlszeile kompiliere. –