Существует вероятность незначительной потери производительности, потому что компилятор иногда добавляет методы искусственного моста. Рассмотрим следующий пример:
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;
}
}
Если вы посмотрите на сгенерированный байт-код, вы увидите: В основном методе стертые методы интерфейса
java.lang.Object Stuff.getData()
void Stuff.putData(java.lang.Object)
. Это методы, реализованные в IntStuff
с подписями
java.lang.Object getData()
void putData(java.lang.Object)
оба с модификаторами public bridge synthetic
, делегируемые "реальным" методам
java.lang.Integer IntStuff.getData()
void putData(java.lang.Integer)
Первый синтетический метод просто возвращает результат Integer, тогда как второй выполняет приведение от Object к Integer перед вызовом putData(Integer)
.
Если вы измените переменную stuff
на тип IntStuff
, то будут вызваны оба метода Integer
вместо синтетических Object
методов.