Por que no compila el siguente código?

oldBoy

Bovino adicto
#1
Solamente quiero saber sus diferentes opiniones del por que este código en java no compilaría, para asi tener mas claro el tema.

Código:
import java.util.*;
class Pila<E> {
    private ArrayList<E> datos;
    public Pila() {
        datos = new ArrayList<E>();
    }
    public void agregar(E dato) {
        datos.add(dato);
    }
    public E recuperar(int pos) {
        return datos.get(pos);
    }
}
class GestionPila {
    void lectura() {
        Pila<Integer> p = new Pila<Integer>();
        p.agregar(7);
        volcado(p);
    }
    void volcado(Pila<? extends Number> pl) {
        System.out.println(pl.recuperar(0));
        pl.agregar(40); // error de compilación
    }
}
 
#2
Checa, no compila porque cuando agregas el 40 estas metiendo un int, el metodo agrega de la clase pila recibe un dato tipo E, no un tipo int. Es por eso que no compila
 

wicholin

Bovino maduro
#4
pues no se mucho pero no sera por ke en p.agregar(7) y despues p1.agregar(40) no ya declaraste el 7 primero ????..................jajaja la verdad no se namas comente jajajjaa
 

malvadomx

Bovino maduro
#5
Despues de darle tantas vueltas al asunto, pense que esto era debido a que
una de las cosas mas dificiles de entender en cuanto a a genericos se refiere es que aunque Integer sea subtipo Number esto no quiere decir que G<Integer> sea subtipo de G<Number>, pero pues leyendo un poco mas <? extends Number> quiere decir que aceptara cualquier pila y el tipo que aloje la pila hereda de Number, pues se me hizo algo demasiado raro que no funcionara, pero leyendo me encuentro con que es ilegal escribir o agregar en la pila dentro de dicho metodo, esto es por seguridad. El tipo de parametro que le queremos agregar a pl es '? extends Number'(esto es un subtipo desconocido de Number ), y como no sabemos de que tipo es, no sabemos si es un supertipo de Number, asi que no es seguro agregar datos aqui a la lista, es por eso que da error de compilacion.

Creo que es debido a esto, es correcto ?

Y cual es el tema ? se van a postear mas preguntas de este tipoo ? son interesantes...
 

oldBoy

Bovino adicto
#6
Despues de darle tantas vueltas al asunto, pense que esto era debido a que
una de las cosas mas dificiles de entender en cuanto a a genericos se refiere es que aunque Integer sea subtipo Number esto no quiere decir que G<Integer> sea subtipo de G<Number>, pero pues leyendo un poco mas <? extends Number> quiere decir que aceptara cualquier pila y el tipo que aloje la pila hereda de Number, pues se me hizo algo demasiado raro que no funcionara, pero leyendo me encuentro con que es ilegal escribir o agregar en la pila dentro de dicho metodo, esto es por seguridad. El tipo de parametro que le queremos agregar a pl es '? extends Number'(esto es un subtipo desconocido de Number ), y como no sabemos de que tipo es, no sabemos si es un supertipo de Number, asi que no es seguro agregar datos aqui a la lista, es por eso que da error de compilacion.

Creo que es debido a esto, es correcto ?

Y cual es el tema ? se van a postear mas preguntas de este tipoo ? son interesantes...
Vientos, man, ese es exactamente el problema, de hecho la solucion es poner <? super Number>.
A ver si de cuando en cuando pongo mas tipos de preguntas como estas.
 
Arriba