62
задан 31 May 2012 в 00:58

2 ответа

Если Вы хотите понять, почему Вам нужен мостовой метод, Вы лучше понимаете то, что происходит без него. Предположим, что нет никакого мостового метода.

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 родительского класса для инициирования полиморфизма.

то, Что делает мостовой метод, тихо переопределить метод в родительском классе со всей информацией из метода с тем же именем, но другой подписью. С помощью мостового метода работал полиморфизм. Хотя на поверхности, Вы переопределяете метод родительского класса с методом другой подписи.

4
ответ дан 31 October 2019 в 14:20

Как обозначено [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() {
    ....
  }
}

UML Hierarchy Diagram of ArrayDeque

, Но проблема тип возврата 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().

  1. () возвраты метода ArrayDeque<E>, который сгенерирован на основе соответствующего клона исходного кода
  2. () возвраты метода Object, который сгенерирован на основе [1 115]. Этот метод делает только вызов другого clone() метод. И, этот метод отмечен как [1 127] ACC_BRIDGE, который указывает, что этот метод сгенерирован компилятором для цели Моста.

UML diagram generated based on ArrayDeque.class

0
ответ дан 31 October 2019 в 14:20