Um, genéricos personalizados T e? Genéricos curinga
? E ambos representam tipos incertos
public static void printColl(ArrayList<?> al){
Iterator<?> it = al.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
}
Mas se for um T genérico personalizado, T pode ser manipulado na função. Por exemplo, pode ser escrito assim em enquanto
T t = it.next ();
System.out.println (t);
1. Tipo genérico curinga <?> Cenários aplicáveis:
Existe apenas um local em toda a classe que usa genéricos. Ao usá-lo, preste atenção em adicionar parâmetros genéricos que não podem chamar métodos relacionados a tipos de parâmetros .
Por exemplo, para imprimir todo o conteúdo em qualquer conjunto de tipo parametrizado, é adequado usar curinga genérico <?>
public static void printCollecton(Collection <?> collection){
for(Object obj: collection){
System.out.println(obj);
}
}
2. Personalize o <T> genérico para se adaptar à cena:
Quando uma variável de tipo é usada para expressar a relação entre dois parâmetros ou entre um parâmetro e um valor de retorno, ou seja, variáveis unificadas de vários tipos são usadas em dois lugares (parâmetros ou valores de retorno) da assinatura do método, ou a variável de tipo é usada no código do corpo do método Também é usado em vez de apenas na assinatura, que deve usar <T> genérico personalizado.
A parte genérica pode chamar alguns métodos sobre o tipo. Por exemplo, o método add da coleção.
public static <T> T autoConvertType(T obj){
return(T)obj;
}
Existem três tipos genéricos:
[1] ArrayList <T> al = new ArrayList <T> (); O elemento de coleção especificado só pode ser do tipo T
[2] ArrayList <?> Al = new ArrayList <?> (); O elemento de coleção pode É um tipo arbitrário, esse tipo de sem sentido, geralmente no método, apenas para ilustrar o uso
[3] ArrayList < ? Extends E > al = new ArrayList < ? Extends E > ();
O limite do tipo genérico
:? Estende E: receba E Tipo ou subtipo de E.
? super E: Recebe o tipo E ou o supertipo de E.