Подтвердить что ты не робот

Когда следует использовать метод класса java 5 класса?

Просматривая код, я натолкнулся на следующий код

trTuDocPackTypdBd.update(TrTuDocPackTypeDto.class.cast(packDto));

и я хотел бы знать, есть ли у этого лидера какие-либо преимущества перед

trTuDocPackTypdBd.update((TrTuDocPackTypeDto)packDto);

Я попросил разработчика ответственность, и он сказал, что использовал его, потому что он был новым (что для меня не очень подходит), но я заинтригован, когда захочу использовать этот метод.

4b9b3361

Ответ 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

Оба эти утверждения идентичны. Выберите тот, который вы найдете более читаемым. Второй метод более распространен в моем опыте, и это тот самый, который я предпочитаю.

Я склонен использовать метод литья исключительно, когда я работаю с отражением, и он лучше читает в этой ситуации. В остальное время я использую второй способ кастинга.