Spring RestTemplate экранирует '& amp;'

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

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

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

Это невозможно использовать в его исходной форме, передавая два Object s для сравнения, поскольку типы компилируются в метод сравнения (в отличие от того, что произойдет, если бы это был типичный параметр типа T, где тип будет удален). Вместо этого, за кулисами, компилятор добавляет «мостовой метод», который выглядит примерно так (был ли он источником Java):

public class MyComparator implements Comparator {
   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 max(List list, Comparator 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 и MyComparator к этой функции, вызов в строке с тегами IMPORTANT потерпел бы неудачу, так как у MyComparator не было бы метода, называемого compare, который принимает два Object s ... только один, который принимает два Integer s.

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

См. также:

1
задан Damian 27 February 2019 в 09:53
поделиться