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