Dos opciones para el tipo de tiempo de ejecución de la comprobación con los genéricos:
Opción 1 - corromper su constructor
Supongamos que usted está sustituyendo indexOf (...), y que desea compruebe el tipo solo por el rendimiento, para evitar repetir la colección completa.
Hacer un constructor sucia como esto:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
continuación, puede utilizar isAssignableFrom para comprobar el tipo.
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
Cada vez que una instancia de su objeto de que tendría que repetirse:
new MyCollection<Apples>(Apples.class);
Usted puede decidir que no vale la pena. En la implementación de ArrayList.indexOf(...), no verifican que el tipo coincida.
Opción 2 - Deje que falle
Si es necesario utilizar un método abstracto que requiere su tipo desconocido, entonces todo lo que realmente quiere es que el compilador deja de llorar sobre instanceof. Si usted tiene un método como este:
protected abstract void abstractMethod(T element);
Usted puede utilizar de esta manera:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
Usted está echando el objeto a T (su tipo genérico), sólo para engañar al compilador. Your cast does nothing at runtime, pero igual obtendrá una ClassCastException cuando intente pasar el tipo de objeto incorrecto a su método abstracto.
NOTA 1: Si realiza moldes adicionales sin marcar en su método abstracto, sus ClassCastExceptions quedarán atrapados aquí. Eso podría ser bueno o malo, así que piénsalo bien.
NOTA 2: You get a free null check when you use instanceof. Dado que no puede usarlo, es posible que deba verificar si no es válido con sus propias manos.
No creo que quiera 'Class.isAssignableFrom'. –
@Tom, escribí esta última noche de memoria, y lo arreglé para pasar realmente la clase (¡duh!) Pero, por lo demás, no entiendo por qué no lo querrías (tal vez necesito más café esta mañana, estoy solo en mi primera taza). – Yishai
Estoy con Tom. ¿Podrías aclarar eso? Usar isAssignableFrom() habría sido mi elección para el trabajo. Tal vez me estoy perdiendo algo? –