Когда следует использовать метод класса java 5 класса?
Просматривая код, я натолкнулся на следующий код
trTuDocPackTypdBd.update(TrTuDocPackTypeDto.class.cast(packDto));
и я хотел бы знать, есть ли у этого лидера какие-либо преимущества перед
trTuDocPackTypdBd.update((TrTuDocPackTypeDto)packDto);
Я попросил разработчика ответственность, и он сказал, что использовал его, потому что он был новым (что для меня не очень подходит), но я заинтригован, когда захочу использовать этот метод.
Ответы
Ответ 1
Эти утверждения не идентичны. Метод cast - это обычный вызов метода (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;
}
Это дает вам безопасный способ избежать неправильной альтернативы простое приведение типа raw к родовому типу:
/* DO NOT DO THIS! */
List raw = new ArrayList();
...
return (List<Widget>) raw;
Компилятор предупредит вас, Unchecked cast from List to List<Widget>
, что означает, что в эллипсисе кто-то мог добавить Gadget
в необработанный список, который в итоге вызовет ClassCastException
, когда вызывающий выполняет итерацию по возвращенному списку ( предположительно) Widget
экземпляры.
Ответ 2
Основной случай для этого (IME) - это когда вам нужно безопасно использовать общий класс/метод. Из-за стирания типа вы не можете использовать T
, но если вам предоставлен параметр Class<? extends T>
, вы можете использовать его для создания и результат будет присваиваться переменной типа T
.
Ответ 3
Я не могу найти пример, где возможен метод литья, и синтаксис отливки.
Тем не менее, глядя на код, кажется, что в случае, если бросок невозможен, метод cast генерирует исключение ClassCastException без прикрепленной информации о типе, тогда как синтаксис cast даст вам некоторые подсказки (например, "не может отбрасывать Snoopy на TyrannosorusRex" )
:
/**
* Casts an object to the class or interface represented
* by this <tt>Class</tt> object.
*
* @param obj the object to be cast
* @return the object after casting, or null if obj is null
*
* @throws ClassCastException if the object is not
* null and is not assignable to the type T.
*
* @since 1.5
*/
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException();
return (T) obj;
}
Ответ 4
В первой форме
trTuDocPackTypdBd.update(TrTuDocPackTypeDto.class.cast(packDto));
вы можете сделать это:
public void dynamicCast( Class clazz, Object o ) {
this.x = clazz.cast( o );
}
Со вторым вы не можете. Класс каста должен быть жестко закодирован.
Зачем вам использовать переменную, которую нужно перенести на первое место? Это другой вопрос.:) Первое, что приходит в голову, это то, что вы не знаете (во время компиляции) класс, на который будет отправлен.
Ответ 5
Оба эти утверждения идентичны. Выберите тот, который вы найдете более читаемым. Второй метод более распространен в моем опыте, и это тот самый, который я предпочитаю.
Я склонен использовать метод литья исключительно, когда я работаю с отражением, и он лучше читает в этой ситуации. В остальное время я использую второй способ кастинга.