Xtr*_*ica 4 java parameters class
我正在开发一个Java语言的Web应用程序,它由一个系统和一些模块组成.所有这些都实现了IAppIdentifier接口,我将所有模块引用和系统本身存储在List系统中.
我们的想法是以这样的方式设计:如果每个模块具有所需的接口(从IAppIdentifier扩展),则每个模块都能够访问系统本身或其他模块,因此他们必须向系统询问它们.
我有这个代码有效:
@Override
public IAppIdentifier moduleByClass(Class<? extends IAppIdentifier> clazz) {
List<IAppIdentifier> iApps = this.get_Iapps();
for (IAppIdentifier iApp : iApps) {
if (clazz.isAssignableFrom(iApp.getClass())) {
return iApp;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
基本上,它检查数组中的每个类是否可以从所需的接口分配,如果是,它将返回该实例.但问题是我必须在方法返回时抛出它.
例如,我必须实现类似的东西来获取系统的实例:
((ISystem) this.get_Service().moduleByClass(ISystem.class))
Run Code Online (Sandbox Code Playgroud)
我的问题是,在java中是否有任何方法可以避免再次执行该转换,以确保它将返回与我在编译时作为参数传递的相同类型?
将方法签名更改为此方法:
public <T extends IAppIdenfitier> T moduleByClass(Class<T> clazz)
Run Code Online (Sandbox Code Playgroud)
这应该工作.
即使你interface不是通用的,你仍然可以在方法中使用泛型来达到他们自己的目的.通过此代码,您可以提供T必须为其IAppIdentifier自身或必须扩展它的通用规则.您的方法现在将返回类型的对象T并将其作为参数类Class<T>.
然后在您调用方法的代码中,moduleByClass您不必抛出它,例如:
ISystem = this.get_Service().moduleByClass(ISystem.class);
Run Code Online (Sandbox Code Playgroud)
这里不需要演员,一切都会编译.
根据@XtremeBiker的好评,需要更多信息.在Inside moduleByClass方法中,需要将结果类型转换为T.所以它是:
return iApp;
Run Code Online (Sandbox Code Playgroud)
但现在它应该是:
return clazz.cast(iApp);
Run Code Online (Sandbox Code Playgroud)
无论如何,在调用该方法时,每次在方法体内进行强制转换时,它仍然不那么烦人.