Если Вы хотите понять, почему Вам нужен мостовой метод, Вы лучше понимаете то, что происходит без него. Предположим, что нет никакого мостового метода.
class A<T>{
private T value;
public void set(T newVal){
value=newVal
}
}
class B extends A<String>{
public void set(String newVal){
System.out.println(newVal);
super.set(newVal);
}
}
Уведомление, что после стирания, метод set
в A
стал public void set(Object newVal)
с тех пор, существует не привязано параметр Типа T
. Нет никакого метода в классе B
, подпись которого совпадает с set
в A
. Таким образом, нет никакого переопределения. Следовательно, когда что-то вроде этого произошло:
A a=new B();
a.set("Hello World!");
Полиморфизм не будет работать здесь. Помните, что необходимо переопределить метод родительского класса в дочернем классе так, чтобы можно было использовать var родительского класса для инициирования полиморфизма.
то, Что делает мостовой метод, тихо переопределить метод в родительском классе со всей информацией из метода с тем же именем, но другой подписью. С помощью мостового метода работал полиморфизм. Хотя на поверхности, Вы переопределяете метод родительского класса с методом другой подписи.
Как обозначено [1 117] эта статья и эта статья , основная причина мостового метода Java Стирание Типа и Полиморфизм .
Позволяют нам взять класс ArrayDeque ( исходный код ) как пример, он содержит clone()
метод как рев, потому что класс ArrayDeque
реализует эти Cloneable
интерфейс, таким образом, он должен переопределить Object.clone()
метод.
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
{
public ArrayDeque<E> clone() {
....
}
}
, Но проблема тип возврата ArrayDeque.clone()
, ArrayDeque<E>
, и это не соответствовало к сигнатуре метода, определенной в родителе Object.clone()
, и в [1 124] Object.java, который тип возврата Object
вместо этого.
public class Object {
protected native Object clone() throws CloneNotSupportedException;
}
несоответствие типов возврата является проблемой для [1 140] Полиморфизм . Таким образом в скомпилированном файле ArrayDeque.class
результата, компилятор Java генерировал два clone()
методы, одно соответствие подпись в исходном коде, другом одном соответствии к подписи в клоне родительского класса Object.clone()
.
ArrayDeque<E>
, который сгенерирован на основе соответствующего клона исходного кода Object
, который сгенерирован на основе [1 115]. Этот метод делает только вызов другого clone()
метод. И, этот метод отмечен как [1 127] ACC_BRIDGE, который указывает, что этот метод сгенерирован компилятором для цели Моста.