Когда вы разрабатываете API, когда вы используете, а не используете дженерики? - PullRequest
1 голос
/ 16 февраля 2012

Например, просматривая документацию по Java EE 5 для javax.persistence.EntityManager, почему метод persist объявлен как void persist(Object entity), а метод слияния - <T> T merge(T entity)?Не кажется ли это непоследовательным или асимметричным, что постоянство не обобщено?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Метод persist может принимать любой тип объекта (*) и возвращает void.Вариантов нет.

Метод merge возвращает объект того же класса, что и его параметр.Чтобы передать это, им нужно использовать дженерики.

(*) Конечно, это должен быть объект, но он не связан с иерархией классов (управляется аннотациями, а не маркероминтерфейсы).

1 голос
/ 16 февраля 2012

Объявление слияния вынуждает пользователя API передавать тип в качестве параметра, совместимого с возвращаемым типом, хотя внутри метода JPA не принимает предварительные значения обобщенных типов (поскольку все еще нуждается в отражении).

Для метода persist проблема заключается в том, что

 void persist (T entity)

точно так же выразителен, как и

 void persist (Object entity)

Поскольку пользователь API по-прежнему может передавать любой объект внутрь, а так как обобщенияне используются внутри метода (JPA все еще должен использовать отражение).

...