Sobes.tech
Junior — Middle

Čím sa líšia kľúčové slová extends a super pri používaní generík v Jave?

sobes.tech AI

Odpoveď od AI

V Jave, pri práci s generikmi sa ključnimi besedami extends in super omejujemo tipe in vplivajo na kovariantnost in kontravariantnost.

  • ? extends T — zgornja omejitev (kovariantnost). Omogoča uporabo tipa T ali katerega koli njegovega podrazreda. To pomeni, da lahko beremo objekte tipa T iz zbirke, vendar ne moremo varno dodajati objektov v takšno zbirko (razen null).

  • ? super T — spodnja omejitev (kontravariantnost). Omogoča uporabo tipa T ali katerega koli njegovega nadrazreda. To pomeni, da lahko dodajamo objekte tipa T v zbirko, pri branju pa lahko dobimo le objekte tipa Object ali bolj splošnega tipa.

Primer:

List<? extends Number> listExtends = new ArrayList<Integer>();
Number num = listExtends.get(0); // Lahko beremo kot Number
// listExtends.add(10); // Napaka pri prevajanju

List<? super Integer> listSuper = new ArrayList<Number>();
listSuper.add(10); // Lahko dodamo Integer
Object obj = listSuper.get(0); // Pri branju je tip Object

Torej, extends se uporablja, ko želimo brati podatke iz strukture, super pa, ko želimo zapisovati podatke.