2015-01-09 15 views
8

への変換を達成する方法Spring ApplicationContextとそのメソッドgetBeansOfTypeを使用しているときに、ジェネリック型の問題が発生しました。List <SomeParamType>からList <SomeParamType><?>>

class Test 
{ 
    List<Generator<?>> allGenerators = 
     new ArrayList(getBeansOfType(Generator.class).values()); // Raw type warning 
                   // for new ArrayList() 
    <T> Map<String, T> getBeansOfType(Class<T> klass) { 
    return emptyMap(); 
    } 
} 

interface Generator<R> {} 

私はコンテナからのパラメータ化された型のすべてのBeanを取得する:これは、問題を示しています。私はそれらをGenerator<?>とし、カスタムロジックを使用して、各Generatorインスタンスのプロパティに基づいて適切な型パラメータに安全にキャストしたいと考えています。

私の問題は、コンセプチュアルレベルでチェックされていないタイプのパラメータにコミットしていないのに、タイプセーフティ警告なしでallGeneratorsに割り当てる方法が見つからないということです。私は、生の型をワイルドカード型に変換したいだけです。

そこに行くのに@SuppressWarningsを必要としないイディオムはありますか?

答えて

3

ない実際の変換が、警告なしに、必要なタイプのリストを構築するプログラム:

public List<Generator<?>> solution() { 
    List<Generator<?>> dst = new ArrayList<>(); 
    for (Generator<?> g : getBeansOfType(Generator.class).values()) { 
     dst.add(g); 
    } 
    return dst; 
} 
+1

しかし、これは明らかにジェネレータgについての "生のタイプ"警告を与えます。 Eclipseでこの警告を無効にすることはできますが、それは私が目指していることではありません。 –

+0

@MarkoTopolnik 'Generator 'を 'g 'の型として使用しても問題ありません。(少なくともコードはコンパイルされ、警告は出ません) – Raffaele

+0

-Xlintを有効にする必要があります: IntelliJを使用して警告を表示するか、この設定を有効にして手動でコンパイルしてください。 –

1

私はそれが(ワイルドカードパラメータを1に、生タイプを変換する)ことはできませんと仮定します。

理由はジェネリック型(特に、ワイルドカード)がクラス型よりも別の何かで、クラス型のツールでは表現できないということです。

関連する問題