Сегодня я понял, что это компилируется и работает нормально:
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)
вызовет первый.
Являются ли привязанные дженерики частью сигнатуры метода? или это магия разрешения перегрузки метода?
<T extends String>
удаляется доString
, тогда как только<T>
удаляется доObject
, поэтому компилятор создаст два перегруженных метода:handle(Object)
иhandle(String)
, а в других местах эти методы можно выбрать в соответствии с типом аргумента. - person Pshemo   schedule 20.07.2018