Что такое мост или синтетические методы в java? [Дубликат]

Асинхронная версия:

<script type="text/javascript">
  function initialize() {
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var infowindow = new google.maps.InfoWindow();

    var marker, i;

    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
}

function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&' +
      'callback=initialize';
  document.body.appendChild(script);
}

window.onload = loadScript;
  </script>
50
задан Charles 30 May 2012 в 21:58
поделиться

3 ответа

Это метод, который позволяет классу, расширяющему общий класс или реализующему общий интерфейс (с конкретным параметром типа), все еще использоваться как необработанный тип.

Представьте себе:

public class MyComparator implements Comparator<Integer> {
   public int compare(Integer a, Integer b) {
      //
   }
}

Это невозможно использовать в его исходной форме, передавая два Object s для сравнения, поскольку типы компилируются в метод сравнения (в отличие от того, что произойдет, если бы это был типичный параметр типа 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> и MyComparator к этой функции, вызов в строке с тегами IMPORTANT потерпел бы неудачу, так как у MyComparator не было бы метода, называемого compare, который принимает два Object s ... только один, который принимает два Integer s.

Часто задаваемые вопросы ниже - хорошее чтение.

См. также:

63
ответ дан Community 28 August 2018 в 02:31
поделиться

Следует отметить, что компилятор описывает метод MyComparator:

public int compare(Integer a, Integer b) {/* code */}

пытается переопределить Comparator<T>

public int compare(T a, T b);

из объявленный тип Comparator<Integer>. В противном случае MyComparator 's compare будет обрабатываться компилятором как дополнительный (перегруженный), а не метод переопределения. И как таковой, для него не будет создан мостовой метод.

0
ответ дан Callistus 28 August 2018 в 02:31
поделиться

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

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 для инициирования полиморфизма.

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

0
ответ дан ch48h2o 28 August 2018 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: