获取我正在通过参数传递的相同Java类实例

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中是否有任何方法可以避免再次执行该转换,以确保它将返回与我在编译时作为参数传递的相同类型?

emk*_*a86 5

将方法签名更改为此方法:

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)

无论如何,在调用该方法时,每次在方法体内进行强制转换时,它仍然不那么烦人.