Java >> Java tutorial >  >> Tag >> extends

Java Generic med ArrayList <? udvider A> add element

ArrayList<? extends A> betyder en ArrayList af en eller anden ukendt type, der udvider A .
Denne type er muligvis ikke C , så du kan ikke tilføje en C til ArrayList.

Faktisk, da du ikke ved, hvad ArrayList skal indeholde, kan du ikke tilføje noget til ArrayList.

Hvis du vil have en ArrayList, der kan indeholde enhver klasse, der arver A , brug en ArrayList<A> .


Det er ikke muligt at tilføje elementer i samling, der bruger ? extends .

ArrayList<? extends A> betyder, at dette er en ArrayList af typen (nøjagtig én type), der udvider A . Så du kan være sikker på, at når du ringer til get metode, får du noget, der er A. Men du kan ikke tilføje noget, fordi du ikke ved, hvad der præcist er ArrayList indeholder.


Brugte jeg <? extends A> korrekt?

List<? extends A> list; betyder, at 'listen' refererer til en objektimplementeret grænseflade Liste, og listen kan indeholde elementer, der er nedarvet fra klasse A (inklusive A). Med andre ord er følgende udsagn korrekte:

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>();

Java-generics er en stærk typekontrol ved kompilering. Compileren bruger generics til at sikre, at din kode ikke tilføjer de forkerte objekter til en samling.

Du forsøgte at tilføje C i ArrayList<B>

listB1.add(new C());

Hvis det var tilladt objektet ArrayList<B> ville indeholde forskellige objekttyper (B,C).
Det er derfor referencen listB1 fungerer i 'skrivebeskyttet'-tilstand. Derudover kan du tage et kig på dette svar.

hvordan løser man dette?

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

Java tag