personas objetos mostrar llenar guardar elementos elemento como clase arreglo agregar acceder java generics arraylist

mostrar - guardar objetos en un arreglo java



Java Genérico con ArrayList<? extiende A> agregar elemento (6)

¿Usé el <? extends A> <? extends A> correctamente?

List<? extends A> list; significa que la ''lista'' se refiere a un objeto implementado en la lista de la interfaz, y la lista puede contener elementos heredados de la clase A (incluida A). En otras palabras, las siguientes afirmaciones son correctas:

List<? extends A> listA1 = new ArrayList<A>(); List<? extends A> listB1 = new ArrayList<B>(); List<? extends A> listC1 = new ArrayList<C>(); List<? extends A> listD1 = new ArrayList<D>();

Los genéricos de Java son una comprobación de tipos fuerte en tiempo de compilación. El compilador utiliza genéricos para asegurarse de que su código no agregue los objetos incorrectos a una colección.

ArrayList<B> agregar C en ArrayList<B>

listB1.add(new C());

Si se permitiera, el objeto ArrayList<B> contendría diferentes tipos de objetos (B, C).
Es por eso que la lista de referencia B1 funciona en modo ''solo lectura''. Además podrías echar un vistazo a esta respuesta .

¿Cómo resolver esto?

List<A> list = new ArrayList<A>();

Tengo clases A , B , C y D donde B extiende A , C extiende A y D extiende A

Tengo los siguientes ArrayList s cada uno con algunos elementos en ellos:

ArrayList<B> b; ArrayList<? extends A> mix = b;

Tenía la intención de que la mix variable contuviera elementos de tipo B , C o D Intenté agregar un elemento de tipo C en la mix esta manera:

mix.add(anElementOfTypeC);

Pero el IDE no me permite hacerlo y dice:

anElementOfTypeC no se puede convertir a CAP # 1 por el método de conversión de invocación donde CAP # 1 es una nueva variable de tipo: CAP # 1 extiende A desde la captura de? extiende un

¿Usé el <? extends A> <? extends A> correctamente? ¿Cómo puedo resolver esto?


¿No es posible agregar elementos en la colección que usa ? extends ? extends

ArrayList<? extends A> ArrayList<? extends A> significa que esta es una ArrayList de tipo ( exactamente un tipo) que extiende A Así que puedes estar seguro de que cuando llames al método get , obtendrás algo que es A. Pero no puedes agregar algo porque no sabes qué contiene exactamente ArrayList .


Mira este ejemplo y elige según tu requerimiento

package com.generic; import java.util.ArrayList; public class SuperExtendTest { /** * @param args */ public static void main(String[] args) { } public void test() throws Exception { ArrayList<Parent> parents=new ArrayList<>(); parents.add(new Parent()); parents.add(new Child()); //parents.add(new GrandParent()); Not allowed ArrayList<Parent> p=new ArrayList<>(); ArrayList<Child> c=new ArrayList<>(); ArrayList<GrandParent> gp=new ArrayList<>(); testExtendP(p); //testExtendP(c); Not allowed only super type allowed no child testExtendP(gp); testExtends(c); testExtends(p); //testExtends(gp); Not allowed because GrantParent does not extends Parent } /** * This Method allowed get operations for Parent * No add * */ public void testExtends(ArrayList<? extends Parent> list) throws Exception { /* list.add(new Child()); list.add(new Parent()); list.add(new GrandParent()); // can not add */ Child c=(Child) list.get(0); Parent parent=list.get(0); GrandParent gp=list.get(0); /** * Unsafe collection way */ ArrayList list2=new ArrayList(); list.addAll(list2); } /** * This Method allowed add operations for Parent and it''s sub types and on get it gives Object type * */ public void testExtendP(ArrayList<? super Parent> list) throws Exception { list.add(new Child()); list.add(new Parent()); //list.add(new GrandParent()); /*can not add because GrandParent can not be converted to Parent type * * The method add(capture#3-of ? super Parent) in the type ArrayList<capture#3-of ? super Parent> is not applicable for the arguments (GrandParent) * */ Child c=(Child) list.get(0); Parent parent=(Parent) list.get(0); GrandParent gp=(GrandParent) list.get(0); Object obj=list.get(0); /** * Unsafe collection way */ ArrayList list2=new ArrayList(); list.addAll(list2); } /** * This Method allowed all operations for Parent and it''s sub types * */ public void testDirect(ArrayList<Parent> list) throws Exception { list.add(new Child()); list.add(new Parent()); //list.add(new GrandParent()); /* * Can not add GrandParent (Normal generic rule) */ } } class GrandParent{ } class Parent extends GrandParent{ } class Child extends Parent{ }


Puede crear la lista de matrices de tipo super clase. para que puedas hacer esto

ArrayList<A> arrayList=new ArrayList<A>();


Usted podría simplemente declarar:

ArrayList<A> mix = new ArrayList<A>();

Puede agregar cualquier elemento de la clase A o cualquiera de sus subclases en dicha lista. Es solo que cuando salgas de esa lista, solo podrás llamar a los métodos disponibles en A

Tenga en cuenta que A no se limita a ser una clase "de pleno derecho": puede ser una clase abstracta o incluso una interfaz.


ArrayList<? extends A> ArrayList<? extends A> significa una ArrayList de algún tipo desconocido que extiende A
Es posible que ese tipo no sea C , por lo que no puede agregar una C a ArrayList.

De hecho, como no sabe qué debe contener la ArrayList, no puede agregar nada a la ArrayList.

Si desea una ArrayList que pueda contener cualquier clase que herede A , use una ArrayList<A> .