Existe la posibilidad de una pérdida de rendimiento menor, porque el compilador algunas veces agrega métodos de puente sintético. Consideremos el siguiente ejemplo:
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;
}
}
Si nos fijamos en el código de bytes generada, verá: en el método principal, los métodos de interfaz borrados
java.lang.Object Stuff.getData()
void Stuff.putData(java.lang.Object)
se invocan. Que los métodos, implementados en IntStuff
con las firmas
java.lang.Object getData()
void putData(java.lang.Object)
tanto con los modificadores public bridge synthetic
, delegado a los métodos "reales"
java.lang.Integer IntStuff.getData()
void putData(java.lang.Integer)
El primer método sintético simplemente devuelve el resultado Integer, mientras que la segunda realiza un lanzamiento de Object a Integer antes de llamar al putData(Integer)
.
Si cambia la variable stuff
al tipo IntStuff
, se invocan ambos métodos Integer
en lugar de los métodos sintéticos Object
.
No son directamente comparables, por lo que puedo ver. ¿No debería el segundo ejemplo tomar 'Object' como parámetro? –