在设计API时,何时使用而不使用泛型?

时间:2012-02-16 06:59:18

标签: generics java-ee api-design

例如,查看the Java EE 5 documentation的javax.persistence.EntityManager,为什么persist方法声明为void persist(Object entity)但合并方法为<T> T merge(T entity)?持久性不是一成不变似乎不一致或不对称吗?

2 个答案:

答案 0 :(得分:2)

persist方法可以使用任何类型的对象(*)并返回void。没有变化。

merge方法返回与其参数相同的类的对象。为了表达这一点,他们需要使用泛型。

(*)当然,它需要是一个实体,但它与类层次结构无关(它由注释管理,而不是由标记接口管理)。

答案 1 :(得分:1)

合并声明强制API的用户将类型作为与返回类型兼容的参数传递,尽管在JPA方法中没有使用泛型(因为它仍然需要反射)。

对于持久化方法,问题是

 void persist (T entity)

完全一样富有表现力
 void persist (Object entity)

由于API的用户仍然可以传递任何内部对象,并且由于泛型不在方法内部使用(JPA仍然需要使用反射)。