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…
之后的语句中的某个地方使用。那么“不起作用”行的大小写是不可能的?因为即使我把它绑定到一些父类的控制器中,我无论如何都应该把它投给子来调用特定的方法。就像一个注释,你应该考虑学习泛型,然后在不真正理解它们的情况下尝试使用它们。