Onko totta että genericsien käyttö tuottaa nopeampaa koodia koska tyyppicastausta ei tarvitse (=aikaanvievää)?
esim.
Vector items = new Vector();
for(int i = 0; i < stuff.size(); i )
if(((Item)stuff.get(i)).getWeight() == 0)
break;
vs.
Vector items = new Vector();
for(int i = 0; i < stuff.size(); i )
if(stuff.get(i).getWeight() == 0)
break;
esim.
Vector items = new Vector();
for(int i = 0; i < stuff.size(); i )
if(((Item)stuff.get(i)).getWeight() == 0)
break;
vs.
Vector items = new Vector();
for(int i = 0; i < stuff.size(); i )
if(stuff.get(i).getWeight() == 0)
break;
Vastaukset 1
Vanhimmat
Tyyppicastaus ei ole kadonnut mihinkään, vaan sen tekee geneerisessä tapauksessa kääntäjä ohjelmoijan puolesta. Alla on esimerkki havainnollistamassa asiaa. Esimerkki katuu ajonaikaisesti castaus poikkeutukseen viimeiselle tulostus riville, vaikka kyseisillä rivillä ei ole edes näkyvää castausta. Esimerkkistä kannattaa huomioida myös se, että toiseksi viimeinen tulostusrivi menee ajossa läpi, eli "Vector" -tyyppiseen olioon pystytään tallentamaan ja sieltä pystytään hakemaan muunkin kuin "String" luokan olioita.
Jotta geneerinen koodi olisi nopeampaa kuin ei geneerinen, joutuisi kääntäjä luomaan jokaisesta saman luokan geneerisestä luokasta (esim. "Vector", "Vector", "Vector", jne.) oman koodinsa, jolloin taas koodin koko kasvaisi räjähdysmäisesti.
--- ESIMERKI1 ALKAA ---
import java.util.Vector;
public class GeneerinenEsimerkki1 {
public static void main(String[] args) {
Vector vektori = new Vector();
vektori.add("Tekstiä");
((Vector) vektori).add(new Integer(1));
System.out.println(vektori.elementAt(0));
System.out.println(((Vector) vektori).elementAt(1));
System.out.println(vektori.elementAt(1));
}
}
--- ESIMERKI1 LOPPUU ---