4

システムといくつかのモジュールで構成される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;
}

基本的に、配列の各クラスが必要なインターフェイスから割り当て可能であることを確認しており、そうであればそのインスタンスを返します。ただし、問題は、メソッドによって返されたときにキャストする必要があることです。

たとえば、システムのインスタンスを取得するには、次のようなものを実装する必要があります。

((ISystem) this.get_Service().moduleByClass(ISystem.class))

私の質問は、コンパイル時に引数として渡すのと同じ型を確実に返すために、そのキャストを再度行うことを回避する方法がJavaにあるのでしょうか?

4

1 に答える 1

5

メソッドのシグネチャを次のように変更します。

public <T extends IAppIdenfitier> T moduleByClass(Class<T> clazz)

これはうまくいくはずです。

ジェネリックでなくてもinterface、独自の目的のためにメソッドでジェネリックを使用できます。このコードにより、それ自体である必要があるか、それを拡張する必要がTある一般的なルールを提供します。IAppIdentifierあなたのメソッドは、タイプのオブジェクトを返しT、param クラスを as として受け取りClass<T>ます。

次に、メソッドを呼び出すたびにコードmoduleByClassでキャストする必要はありません。次に例を示します。

ISystem = this.get_Service().moduleByClass(ISystem.class);

ここではキャストは必要なく、すべてがコンパイルされます。

@XtremeBiker の良いコメントによると、さらに情報が必要です。メソッド内moduleByClassで、結果の型を にキャストする必要がありTます。それで、次のようになりました。

return iApp;

しかし、今は次のようになります。

return clazz.cast(iApp);

とにかく、そのメソッドが呼び出されるたびにキャストするよりも、メソッド本体内でキャストする方が面倒ではありません。

于 2013-01-31T09:09:35.347 に答える