2

私は多くの実装を提供できる汎用インターフェースを持っています。そのような実装ごとに、Spring 定義ファイルで id 属性を関連付けています。

IConfigurationService<T>

今、ID で実装を取得できるユーティリティ メソッドを作成しようとしています。

次のメソッドは、警告メッセージを表示するユーティリティ メソッドです。

public <T extends Serializable> IConfigurationService<T> getBean(Class<T> type, String id){
        return (IConfigurationService<T>)context.getBean(id, IConfigurationService.class);
    }

警告メッセージ: タイプ セーフティ: IConfigurationService から IConfigurationService へのキャストがチェックされていません。

この警告メッセージを取り除くにはどうすればよいですか?

return ステートメントを次のように変更すると、コンパイル エラーが発生します。

return (IConfigurationService<T>)context.getBean(id, IConfigurationService<T>.class);

ここで私が間違っていることを誰かが特定できれば助かります。

4

2 に答える 2

1

警告を抑制する以外に、その警告を取り除くことはできません。これは、Java ジェネリックのランタイム型消去が原因です。クラス リテラルIConfigurationService.classはジェネリック型情報を提供しません。したがって、IConfigurationService<?>から返されcontext.getBeanます。それを適切な型にキャストする必要があります。

ただし、そのための回避策を使用できます。宣言すると

@Resource
private IConfigrationService<Foo> configService;

IConfigurationServiceSpring コンテキスト管理クラスの 1 つで、Springは型パラメーターが と互換性のある の実装のみを確実に注入しFooます。

于 2013-01-16T07:57:36.190 に答える
-1

つまり、多くの実装を持つ 1 つのインターフェイスがありますか? 各実装に @Qualifier を使用し、@Resource で実装を注入するときに修飾子を使用しないのはなぜですか?

于 2013-01-16T08:35:53.930 に答える