Дженерики Java - PullRequest
       39

Дженерики Java

5 голосов
/ 23 февраля 2009

Почему следующее выглядит лучше, чем старый способ кастования?

MyObj obj = someService.find(MyObj.class, "someId");

против

MyObj obj = (MyObj) someService.find("someId");

Ответы [ 5 ]

9 голосов
/ 23 февраля 2009

Нет гарантии, что неуниверсальная версия вернет объект типа «MyObj», поэтому вы можете получить ClassCastException.

6 голосов
/ 23 февраля 2009

В случае 1 большинство хорошо реализованных сервисов смогут вернуть ноль, если не будет найдено объекта с идентификатором someId типа MyObj. Более того, первый случай позволяет службе иметь определенную логику, специфичную для работы с классами типа MyObj.

В случае 2, если вы не используете instanceof (по возможности избегайте), тогда вы рискуете уродливым ClassCastException, который вам придется поймать и обработать.

4 голосов
/ 23 февраля 2009

Еще одним преимуществом использования явного параметра типа было бы предоставление возможности реализации метода обслуживания с использованием Proxy (в этом случае MyObj должно быть MyInterface). Без явных параметров типа это было бы невозможно.

Вы можете использовать Proxy под одеялом по многим причинам (тестирование по одному)

3 голосов
/ 23 февраля 2009

Одна из причин, по которой первый сценарий лучше, заключается в том, что метод find(Class,String) теперь знает, для чего назначается его возвращаемое значение. Таким образом, теперь он способен выполнять любые соответствующие приведения внутри, а не просто надеяться, что был возвращен правильный тип. Например, предположим, что метод find находит объект String внутри, когда вызывается с помощью "someId". У метода find может быть стратегия приведения String к MyObj экземпляру.

0 голосов
/ 13 мая 2012

Это не лучше. Возможно, это хуже, за исключением очень специфических обстоятельств. Подобные вещи нужны только тогда, когда цель должна вызывать newInstance () (и т. Д.) Для объекта класса - фабричные методы и прочее.

Если вы хотите сохранить электроны, кстати, это также будет работать

MyObj obj = someService.find((Class<MyObj>) null, "someId");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...