Reputation: 355
I heard about generic, but I can't find a way to make it return already casted value. For example:
public <T> T getController(SceneEnum sceneEnum) {
if (sceneData.get(sceneEnum) == null) {
initScene(sceneEnum);
}
return sceneData.get(sceneEnum).getLoader().getController();
}
this method returns different classes, for example MainScreenControler, PopupController etc. but I can't call method from returned class, without casting it.
So is there any way to perform casting inside getter?
Upvotes: 1
Views: 520
Reputation: 3030
Here's a method of casting safely with generics:
public <T> T getController(SceneEnum sceneEnum, Class<T> clazz) {
if (sceneData.get(sceneEnum) == null) {
initScene(sceneEnum);
}
Object controller = sceneData.get(sceneEnum).getLoader().getController();
if (clazz.isInstance(controller)) {
return (T) controller;
} else {
throw new ClassCastException("Failed to cast");
}
}
Upvotes: 2
Reputation: 51713
Try to specify generic explicitly
this.<MainScreenController>getController(MainScreenEnum).someMethod();
inside the class containing getController
or
instance.<MainScreenController>getController(MainScreenEnum).someMethod();
inside a different class (instance
is an instance of the class containing getController
).
Unfortunately, this is hardly shorter than
((MainScreenController) getController(MainScreenEnum)).someMethod();
You can't "cast" inside getter because T
is decided in a call site, not in the definition site.
Upvotes: 2