Estou lendo sobre métodos genéricos do OracleDocGenericMethod . Estou bastante confuso sobre a comparação quando diz quando usar curingas e quando usar métodos genéricos. Citando do documento.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
Poderíamos ter usado métodos genéricos aqui:
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! }
[…] Isso nos diz que o argumento de tipo está sendo usado para polimorfismo; seu único efeito é permitir que vários tipos de argumentos reais sejam usados em diferentes sites de chamada. Se for esse o caso, deve-se usar curingas. Os curingas são projetados para oferecer suporte à subtipagem flexível, que é o que estamos tentando expressar aqui.
Não achamos que o curinga (Collection<? extends E> c);
também suporta um tipo de polimorfismo? Então, por que o uso genérico do método não é considerado bom nisso?
Continuando adiante, afirma,
Métodos genéricos permitem que parâmetros de tipo sejam usados para expressar dependências entre os tipos de um ou mais argumentos para um método e / ou seu tipo de retorno. Se não houver essa dependência, um método genérico não deve ser usado.
O que isto significa?
Eles apresentaram o exemplo
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[...]
Poderíamos ter escrito a assinatura desse método de outra maneira, sem usar caracteres curinga:
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
O documento desencoraja a segunda declaração e promove o uso da primeira sintaxe? Qual é a diferença entre a primeira e a segunda declaração? Ambos parecem estar fazendo a mesma coisa?
Alguém pode colocar luz nesta área.
?
. Você pode reescrevê-lo como `public static <T1 extends Number, T2 extends Number> void copy (Lista <T1> dest, List <T2> src) e, neste caso, fica óbvio o que está acontecendo.