Estoy leyendo sobre métodos genéricos de OracleDocGenericMethod . Estoy bastante confundido acerca de la comparación cuando dice cuándo usar comodines y cuándo usar métodos genéricos. Citando del documento.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
Podríamos haber utilizado métodos genéricos aquí en su lugar:
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] Esto nos dice que el argumento de tipo se está utilizando para polimorfismo; su único efecto es permitir el uso de una variedad de tipos de argumentos reales en diferentes sitios de invocación. Si ese es el caso, se deben usar comodines. Los comodines están diseñados para admitir subtipos flexibles, que es lo que estamos tratando de expresar aquí.
¿No creemos que el comodín como (Collection<? extends E> c);
también apoya una especie de polimorfismo? Entonces, ¿por qué el uso de métodos genéricos no se considera bueno en esto?
Continuando adelante, dice,
Los métodos genéricos permiten utilizar parámetros de tipo para expresar dependencias entre los tipos de uno o más argumentos de un método y / o su tipo de retorno. Si no existe tal dependencia, no se debe utilizar un método genérico.
¿Qué significa esto?
Han presentado el ejemplo
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[…]
Podríamos haber escrito la firma para este método de otra manera, sin usar comodines en absoluto:
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
¿El documento desalienta la segunda declaración y promueve el uso de la primera sintaxis? ¿Cuál es la diferencia entre la primera y la segunda declaración? ¿Ambos parecen estar haciendo lo mismo?
¿Alguien puede poner luz en esta área?
?
en absoluto. Puede reescribirlo como `public static <T1 extiende Número, T2 extiende Número> copia vacía (Lista <T1> dest, Lista <T2> src) y en este caso se vuelve obvio lo que está pasando.