2012-03-10 8 views
0

私は春3.0に以下の文書読ん:Java 5のではSpringは、「強く型付けされたコレクション」に関して実行時にジェネリックな型情報を取得する方法を教えてください。

厳密に型指定されたコレクション(Javaの5+のみ)

を以降では、(一般的なタイプを使用して)厳密に型指定されたコレクションを使用することができます。つまり、(たとえば)String要素のみを含むことができるようにCollection型を宣言することができます。 Springを使用して厳密に型指定されたCollectionをBeanに挿入する場合は、Springの型変換サポートを利用して、厳密に型指定されたCollectionインスタンスの要素を追加する前に適切な型に変換しますコレクション。

public class Foo { 

    private Map<String, Float> accounts; 

    public void setAccounts(Map<String, Float> accounts) { 
     this.accounts = accounts; 
    } 
} 

<beans> 
    <bean id="foo" class="x.y.Foo"> 
     <property name="accounts"> 
      <map> 
       <entry key="one" value="9.99"/> 
       <entry key="two" value="2.75"/> 
       <entry key="six" value="3.99"/> 
      </map> 
     </property> 
    </bean> 
</beans> 

FOO豆のアカウントのプロパティは、注射用に準備されている場合、強く型付けされた地図の要素型についてのジェネリック情報は、反射によって提供されています。したがって、Springの型変換インフラストラクチャは、さまざまな値要素をFloat型として認識し、9.99,2.75、および3.99の文字列値を実際のFloat型に変換します。

どうすれば可能ですか?私が知っているように、コンパイル中にジェネリックタイプの情報は消去されます。

答えて

6

これは、オブジェクトの型はフィールドではなく消去されるために機能します。詳細な説明は、Where are generic types stored in java class files?をご覧ください。

本質的に、(驚き)1.5に導入されたField.getGenericType()メソッドがあり、常に信頼できる汎用タイプのフィールドを返します。だから春で、平らな反射によってaccountsの一般的なタイプ(<String, Float>)を読むことができます。

同じメカニズムが使用されています。 。 JPAプロバイダがorders1対多の関係の第二の側面であるかを把握することができないであろう、このJava 5の機能がないと

@Entity 
public class Customer { 

    @OneToMany 
    private Set<Order> orders; 

} 

@Entity 
public class Order { 

    @Id 
    private Integer id; 

} 

:これは完全に有効と作業です。

関連する問題