2. Ultimo tema de esto de los genéricos
Empecemos diciendo que hay 3 tipos de wildcards (comodines)
? // unbounded wildcard --- comodin no-encerrado
? extends T // bounded wildcard --- comodín encerrado
? super T // lower-bound wildcard --- comodín bajo_nivel-encerrado
mientras T es un tipo de dato genérico
3. ?
<?> es un comodín que representa cualquier tipo de objeto.
Y es equivalente a <? extends Object>
Y <? extends T> no hay mucho que decir ya que es evidente su función
4. public class DemoComodin{
public static void main(String…args){
PilaGenerica<Integer> intPila = new PilaGenerica<>();
intPila.push(1);
intPila.push(2);
intPila.push(-4);
imprimir(intPila);
}
// imprime objetos y vacía la pila
public static void imprimir(PilaGenerica<?> pila) {
while( !.pila.isEmpty() )
System.out.print( pila.pop() + “ ” );
}
}
5. ? super T
Usemos un ejemplo.
pila1 contiene Strings y pila2 contiene Objetos y se usan en un método
de suma(pila1, pila2)
La operación genera un error por manejo de tipos inapropiados.
Porque PilaGenerica<String> no es lo mismo que PilaGenerica<Object>.
Entonces <? super T> se utiliza. Object es un supertipo de String.
6. public class Comodin{
public static void main(String[] args){
PilaGenerica<String> pila1 = new PilaGenerica<>();
PilaGenerica<Object> pila2 = new PilaGenerica<>();
pila2.push( “Hola” );
pila2.push( 2 );
pila1. push( “Mundo” );
suma(pila1, pila2);
Comodin.imprimir(pila2);
}
public static <T> void suma(PilaGenerica<T> pila1, PilaGenerica<? super T> pila2){
while (!pila1.isEmpty())
pila2.push(pila1.pop());
}
}