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

Generics 在设计API时,何时使用泛型,何时不使用泛型?,generics,jakarta-ee,api-design,Generics,Jakarta Ee,Api Design,例如,查看javax.persistence.EntityManager,为什么persistent方法声明为void persistent(Object entity),而merge方法声明为T merge(T entity)?persist没有泛化是不是看起来不一致或不对称?persist方法可以接受任何类型的对象(*),并返回void。没有变化 merge方法返回与其参数相同类的对象。为了传达这一点,他们需要使用泛型 (*)当然,它需要是一个实体,但它与类层次结构无关(它由注释管理,而不是

例如,查看javax.persistence.EntityManager,为什么persistent方法声明为
void persistent(Object entity)
,而merge方法声明为
T merge(T entity)
?persist没有泛化是不是看起来不一致或不对称?

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

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


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

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

对于persist方法,问题是

 void persist (T entity)
完全像

 void persist (Object entity)
因为API的用户仍然可以在内部传递任何对象,并且由于泛型没有在方法内部使用(JPA仍然需要使用反射)