Ответ 1
Это метод, который позволяет классу, расширяющему общий класс или реализующему общий интерфейс (с конкретным параметром типа), все еще использоваться как необработанный тип.
Представьте себе следующее:
public class MyComparator implements Comparator<Integer> {
public int compare(Integer a, Integer b) {
//
}
}
Это не может использоваться в его исходной форме, передавая два Object
для сравнения, поскольку типы компилируются в метод сравнения (вопреки тому, что произойдет, если бы он был типичным параметром типа T, где тип стираться). Вместо этого, за кулисами, компилятор добавляет "метод моста", который выглядит примерно так (это был источник Java):
public class MyComparator implements Comparator<Integer> {
public int compare(Integer a, Integer b) {
//
}
//THIS is a "bridge method"
public int compare(Object a, Object b) {
return compare((Integer)a, (Integer)b);
}
}
Компилятор защищает доступ к мостовому методу, принуждая, что явные вызовы непосредственно к нему приводят к ошибке времени компиляции. Теперь класс можно использовать и в необработанном виде:
Object a = 5;
Object b = 6;
Comparator rawComp = new MyComparator();
int comp = rawComp.compare(a, b);
Зачем еще это нужно?
В дополнение к добавлению поддержки явного использования необработанных типов (в основном для обратной совместимости) мосты также необходимы для поддержки стирания стилей. С стиранием типа метод, подобный этому:
public <T> T max(List<T> list, Comparator<T> comp) {
T biggestSoFar = list.get(0);
for ( T t : list ) {
if (comp.compare(t, biggestSoFar) > 0) {
biggestSoFar = t;
}
}
return biggestSoFar;
}
фактически скомпилирован в байт-код, совместимый с этим:
public Object max(List list, Comparator comp) {
Object biggestSoFar = list.get(0);
for ( Object t : list ) {
if (comp.compare(t, biggestSoFar) > 0) { //IMPORTANT
biggestSoFar = t;
}
}
return biggestSoFar;
}
Если метод моста не существовал, и вы передали эту функцию List<Integer>
и a MyComparator
, вызов в строке с тегами IMPORTANT
завершился с ошибкой, так как MyComparator
не будет иметь метод под названием compare
который принимает два Object
s... только один, который принимает два Integer
s.
Часто задаваемые вопросы ниже - хорошее чтение.