Эти утверждения не идентичны. Метод приведения является обычным вызовом метода (invokevirtual
инструкция JVM), тогда как другой является языковой конструкцией (checkcast
инструкция). В случае, который вы показываете выше, вы должны использовать вторую форму: (TrTuDocPackTypeDto) packDto
Метод cast
используется в рефлексивном программировании с обобщениями, когда у вас есть экземпляр класса для некоторого типа переменной. Вы можете использовать это так:
public <T> Set<T> find(Class<T> clz, Filter criteria) {
List<?> raw = session.find(clz, criteria); /* A legacy, un-generic API. */
Set<T> safe = new HashSet<T>();
for (Object o : raw)
safe.add(clz.cast(o));
return safe;
}
Это дает вам безопасный способ избежать неправильной альтернативы простого приведения необработанного типа к универсальному типу:
/* DO NOT DO THIS! */
List raw = new ArrayList();
...
return (List<Widget>) raw;
Компилятор предупредит вас, Unchecked cast from List to List<Widget>
, что означает, что в многоточии кто-то мог добавить Gadget
в необработанный список, что в конечном итоге приведет к ClassCastException
, когда вызывающая программа итерит по возвращенному списку предполагается) Widget
экземпляров.