una tipos tener sirve que puede parametros para metodos ejemplos cuantos constructores con comando clase java java-5

tipos - ¿Cuándo debería usar el elenco del método java 5 de Class?



this en java (5)

Ambas declaraciones son idénticas. Elija cualquiera que encuentre más legible. El segundo método es más común en mi experiencia, y es la vez que prefiero.

Tiendo a utilizar el método de conversión solo cuando estoy trabajando con la reflexión, y se lee mejor en esa situación. El resto del tiempo me encuentro usando la segunda forma de casting.

Mirando a través de algún código encontré el siguiente código

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

y me gustaría saber si el casting de esta manera tiene alguna ventaja sobre

trTuDocPackTypdBd.update((TrTuDocPackTypeDto)packDto);

Le pregunté al desarrollador responsable y me dijo que lo usó porque era nuevo (lo que no me parece una buena razón para mí), pero me intriga saber cuándo querría usar el método.


El caso principal para hacerlo (IME) es cuando necesita emitir de forma segura una clase / método genérico. Debido a la borradura de tipo, no puede enviar a T pero si se le ha proporcionado una Class<? extends T> Class<? extends T> parámetro Class<? extends T> y luego puede usarlo para emitir y el resultado será asignable a una variable de tipo T


Estas declaraciones no son idénticas. El método cast es una invocación de método normal ( invokevirtual JVM instruction) mientras que el otro es un constructo de lenguaje (instrucción checkcast ). En el caso que muestra arriba, debe usar la segunda forma: (TrTuDocPackTypeDto) packDto

El método de cast se utiliza en programación reflexiva con genéricos, cuando tiene una instancia de clase para algún tipo de variable. Podrías usarlo así:

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; }

Esto le brinda una manera segura de evitar la alternativa incorrecta de simplemente convertir un tipo sin formato en un tipo genérico:

/* DO NOT DO THIS! */ List raw = new ArrayList(); ... return (List<Widget>) raw;

El compilador le advertirá, Unchecked cast from List to List<Widget> , lo que significa que en los puntos suspensivos, alguien podría haber agregado un Gadget a la lista sin procesar, lo que eventualmente causará una ClassCastException cuando la persona que llama itera sobre la lista devuelta de (supuesta ) Instancias de Widget .


Con la primera forma

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

Puedes hacerlo:

public void dynamicCast( Class clazz, Object o ) { this.x = clazz.cast( o ); }

Con el segundo no puedes. La clase de casting debe estar codificada.

¿Por qué usarías una variable para lanzar en primer lugar? Esa es otra pregunta. :) Lo primero que viene a la mente es que no sabes (en tiempo de compilación) la clase a la que se lanzará.


No puedo encontrar un ejemplo en el que el método de conversión sea posible y la sintaxis de conversión no. Sin embargo, al mirar el código, parece que en caso de que el molde no sea posible, el método de lanzamiento arroja una ClassCastException sin información de tipo adjunta, mientras que la sintaxis de lanzamiento le dará algunos consejos (como en "no se pudo lanzar Snoopy a 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; }