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>
.