2009-02-23 2 views
5

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

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

против

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

+1

Кто говорит, что это лучше? – Milhous

ответ

4

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

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

9

Там нет никакой гарантии, что версия не-дженериков будет возвращать объект типа 'MyObj', так что вы можете получить ClassCastException.

6

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

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

3

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

0

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

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

MyObj obj = someService.find((Class<MyObj>) null, "someId");