Keker
Keker

Reputation: 355

Is it possible to cast returned value before returning?

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

Answers (2)

George
George

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

Dmytro Mitin
Dmytro Mitin

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

Related Questions