C'è un potenziale per una minore perdita di prestazioni, perché il compilatore a volte aggiunge metodi di bridge sintetici. Si consideri il seguente esempio:
public class GenericPerformance {
public static void main(final String[] args) {
final Stuff<Integer> stuff = new IntStuff();
final Integer data = stuff.getData();
stuff.putData(data);
}
}
interface Stuff<T> {
T getData();
void putData(T stuff);
}
class IntStuff implements Stuff<Integer> {
private Integer stuff;
public Integer getData() {
return stuff;
}
public void putData(final Integer stuff) {
this.stuff = stuff;
}
}
Se si guarda il bytecode generato, si vedrà: Nel metodo Main, i metodi di interfaccia cancellati
java.lang.Object Stuff.getData()
void Stuff.putData(java.lang.Object)
vengono invocati. Che i metodi, implementati in IntStuff
con le firme
java.lang.Object getData()
void putData(java.lang.Object)
sia con i modificatori public bridge synthetic
, delegano ai metodi "reale"
java.lang.Integer IntStuff.getData()
void putData(java.lang.Integer)
Il primo metodo sintetico semplicemente restituisce il risultato intero, mentre il secondo esegue un cast da Object a Integer prima di chiamare putData(Integer)
.
Se si modifica la variabile stuff
per digitare IntStuff
, vengono chiamati entrambi i metodi Integer
anziché i metodi sintetici Object
.
fonte
2010-04-30 19:11:53
Non sono direttamente confrontabili, per quanto posso vedere. Non dovrebbe il secondo esempio prendere 'Object' come parametro? –