Является ли дженерики связаны частью сигнатуры метода в Java?
Сегодня я понял, что это компилируется и работает нормально:
public class Test {
public static <T> T handle(T val) {
System.out.println("T");
return val;
}
public static <T extends String> T handle(T val) {
System.out.println("T extends String");
return val;
}
}
Два метода handle
имеют одно и то же имя и одинаковое число и тип (?
) Параметров. Единственное отличие состоит в том, что второй метод handle
имеет более строгую общую привязку. IDE вообще не жалуется, и код компилируется нормально. При запуске метод выбирается как ожидалось - например, Test.handle("this is a string")
вызывается во второй метод, а Test.handle(10)
будет вызывать первый.
Рассматривается ли обобщенная часть частичной подписи метода? или это метод магии разрешения перегрузки?
Ответы
Ответ 1
Generics предлагает безопасность во время компиляции; Во время выполнения ваши методы стираются следующим образом:
public static Object handle(Object val) {
System.out.println("T");
return val;
}
public static String handle(String val) {
System.out.println("T extends String");
return val;
}
Из-за перегрузки метода handle(String)
будет вызываться при передаче String
, и handle(Object)
будет вызываться при передаче любого другого Object
(помните, что String
является окончательным и не может иметь детей).
Ответ 2
Рассматривается оценка дженериков.
В первом случае границей является Object; во втором случае оценка - String.
Когда типы стираются, привязка используется вместо переменной типа, поэтому они становятся просто перегрузкой (и возвратом) параметров объекта и строки соответственно.
В этом нет ничего плохого.