Java 是否可以在返回之前强制转换返回值?

Java 是否可以在返回之前强制转换返回值?,java,generics,Java,Generics,我听说过泛型,但我找不到一种方法让它返回已经铸造的值。 例如: public <T> T getController(SceneEnum sceneEnum) { if (sceneData.get(sceneEnum) == null) { initScene(sceneEnum); } return sceneData.get(sceneEnum).getLoader().getController(); } public T getCo

我听说过泛型,但我找不到一种方法让它返回已经铸造的值。 例如:

public <T> T getController(SceneEnum sceneEnum) {
    if (sceneData.get(sceneEnum) == null) {
        initScene(sceneEnum);
    }
    return sceneData.get(sceneEnum).getLoader().getController();
}
public T getController(scenenum scenenum){
if(sceneData.get(scenenum)==null){
初始场景(场景);
}
返回sceneData.get(scenenum.getLoader().getController();
}
此方法返回不同的类,例如MainScreenControler、PopupController等。 但我不能从返回的类调用方法,而不强制转换它

  • 作品: ((MainScreenController)getController(MainScreenEnum)).someMethod()
  • 不工作:getController(MainScreenEnum).someMethod()

那么有没有办法在getter内部执行强制转换呢?

尝试显式指定泛型

this.<MainScreenController>getController(MainScreenEnum).someMethod();
在另一个类中(
instance
是包含
getController
的类的实例)

不幸的是,这几乎不比

((MainScreenController) getController(MainScreenEnum)).someMethod();

您不能在getter内部“强制转换”,因为
t
是在调用站点中决定的,而不是在定义站点中决定的。

尝试显式指定泛型

this.<MainScreenController>getController(MainScreenEnum).someMethod();
在另一个类中(
instance
是包含
getController
的类的实例)

不幸的是,这几乎不比

((MainScreenController) getController(MainScreenEnum)).someMethod();

您不能在getter内部“强制转换”,因为
t
是在调用站点中决定的,而不是在定义站点中决定的。

以下是一种使用泛型安全强制转换的方法:

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");
    }
}
public T getController(scenenum scenenum,Class clazz){
if(sceneData.get(scenenum)==null){
初始场景(场景);
}
对象控制器=sceneData.get(scenenum.getLoader().getController();
if(类别isInstance(控制器)){
返回(T)控制器;
}否则{
抛出新的ClassCastException(“未能强制转换”);
}
}

以下是一种使用泛型安全地强制转换的方法:

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");
    }
}
public T getController(scenenum scenenum,Class clazz){
if(sceneData.get(scenenum)==null){
初始场景(场景);
}
对象控制器=sceneData.get(scenenum.getLoader().getController();
if(类别isInstance(控制器)){
返回(T)控制器;
}否则{
抛出新的ClassCastException(“未能强制转换”);
}
}

通用参数
T
未绑定,因此可以是任何对象(例如
Integer
)。我希望泛型参数
T
return…
之后的语句中的某个地方使用。那么“不起作用”行的大小写是不可能的?因为即使我把它绑定到一些父类的控制器中,我无论如何都应该把它投给子来调用特定的方法。就像一个注释,你应该考虑学习泛型,然后在不真正理解它们的情况下使用它们。泛型参数<代码> t>代码>是未绑定的,因此可以是任何东西(例如,代码>整数< /代码>)。我希望泛型参数
T
return…
之后的语句中的某个地方使用。那么“不起作用”行的大小写是不可能的?因为即使我把它绑定到一些父类的控制器中,我无论如何都应该把它投给子来调用特定的方法。就像一个注释,你应该考虑学习泛型,然后在不真正理解它们的情况下尝试使用它们。