Tengo problemas para entender por qué lo siguiente no funciona y estoy seguro de que la respuesta está relacionada con algo básico que no entiendo y espero que alguien pueda ayudar.Problema con los tipos genéricos de ArrayList y herencia de interfaz
entiendo sobre el uso de las interfaces en un ArrayList
tal que si tengo:
public interface Weapon { ... }
public class Gun implements Weapon { ...}
public class Knife implements Weapon { ... }
A continuación, puede insertar cualquier cosa que implementa Arma en el una serie de armas:
ArrayList<Weapon> weapons = new ArrayList<Weapon>();
weapons.add(new Gun());
weapons.add(new Knife();
lo entiendo , pero lo que me confunde es la comprensión de por qué ArrayList<Gun>
no es compatible con ArrayList<Weapon>
de otras maneras. Para ilustrar esto, la siguiente es legal:
public void interfaceIsTheArgument(Weapon w) { ... }
...
interfaceIsTheArgument(new Gun());
interfaceIsTheArgument(new Knife());
pero los siguientes no es:
public void interfaceIsTheArgument(ArrayList<Weapon> w) { ... }
...
interfaceIsTheArgument(new ArrayList<Gun>());
interfaceIsTheArgument(new ArrayList<Knife>());
debido a los últimos informes de llamadas función que el método no es aplicable a sus argumentos.
Mi pregunta es por qué si el método sabe que tareas una ArrayList
con una interfaz como el tipo genérico, ¿por qué no está bien pasar una lista de cuchillos en esa última declaración?
No sé la respuesta exacta, pero lo que puedes hacer para tu segundo ejemplo es usar 'public void interfaceIsTheArgument (ArrayList Extends Weapon>)'. Que funcionará. – fge