Ich habe Probleme mit Generika Umsetzung Fabrik für einen bestimmten AnwendungsfallFabrik Muster mit Generika in Java
Ich habe Modellklassen:
class BaseModel { }
class ModelA extends BaseModel { }
class ModelB extends BaseModel { }
und entsprechende Dienstleistungen an:
class Service<T extends BaseModel> { }
class ServiceA extends Service<ModelA> {}
class ServiceB extends Service<ModelB> {}
Meine Factory-Klasse, um Service entsprechend dem Modell zu erstellen, das es bedient:
class Factory {
private Map<Class<? extends BaseModel>, Class<? extends Service>> registry;
Factory(){
registry = new HashMap<>();
registry.put(ModelA.class, ServiceA.class);
registry.put(ModelB.class, ServiceB.class);
}
Service getService(Class<? extends BaseModel> clazz) throws IllegalAccessException, InstantiationException {
return registry.get(clazz).newInstance();
}
}
Und eine Klasse, die die Fabrik
class Handler<T extends BaseModel>{
private Service<T> myService;
Handler(Class<T> modelClass) {
Factory fact = new Factory();
try {
myService = fact.getService(modelClass);
} catch (IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
}
}
ich verwendet erhalte eine Warnung für die Zeile, die die Fabrik nutzt den Dienst zu bekommen:
"Unchecked assignment 'Service' to 'Service<T>'"
Ich verstehe, warum ich die Nachricht bekommen, da die getService
Methode gibt Service
, aber ich brauche Service<T>
und verwirrt darüber, wie ich den Code ändern kann Service<T>
Alle sugge zu bekommen Stände?
Danke!
Und was * Rückgabetyp * ist die Methode 'getService()' haben? ist es "Service" oder "Service"? –
alfasin
Sie könnten ' Service getService (Klasse clazz)' verwenden und den zurückgegebenen Wert in 'Service 'umwandeln. Sie werden immer noch eine ungeprüfte Warnung in der Methode selbst erhalten, aber das ist eine der Schwächen der Laufzeit-Löschung von Java-Generics. –
bcsb1001
Es gibt zwei Probleme: Erstens gibt es keine Möglichkeit, eine Map zu erstellen, bei der verschiedene Schlüssel verschiedenen generischen Typen entsprechen. Es kann einfach nicht gemacht werden. Zweitens gibt es keine Möglichkeit, die Reflektion sicher zu verwenden, um ein generisch typisiertes Objekt zu erzeugen (wie 'ArrayList' oder 'Service '). Sie wären besser dran, generische Typisierung aus dem Service zu entfernen. Können Sie einige Beispiele für Service-Methoden anzeigen, die den Modell-Subtyp verwenden? –
VGR