我在下面的Spring 3.0文档中阅读:
强类型集合(仅限Java 5+)
在Java 5及更高版本中,您可以使用强类型集合(使用泛型类型)。也就是说,可以声明Collection类型,使其只能包含String元素(例如)。如果您使用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 bean的accounts属性准备好进行注入时,可以通过反射获得有关强类型Map的元素类型的泛型信息。因此Spring的类型转换基础结构可识别各种值元素的类型为Float,字符串值9.99,2.75和3.99将转换为实际的Float类型。
这怎么可能?据我所知,通用类型信息在编译期间被删除。
答案 0 :(得分:6)
这是有效的,因为类型会被删除对象,但不会删除字段。请查看Where are generic types stored in java class files?详细说明其工作原理。
本质上,(惊讶)1.5中引入了Field.getGenericType()
方法,它始终返回字段的可靠泛型类型。所以Spring 能够通过简单的反射来阅读accounts
泛型类型(<String, Float>
)。
注意使用相同的机制,例如在jpa。这完全有效且有效:
@Entity
public class Customer {
@OneToMany
private Set<Order> orders;
}
@Entity
public class Order {
@Id
private Integer id;
}
如果没有此Java 5功能,JPA提供程序将无法弄清楚orders
一对多关系的第二面是什么。