Является ли дженерики связаны частью сигнатуры метода в 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.

Когда типы стираются, привязка используется вместо переменной типа, поэтому они становятся просто перегрузкой (и возвратом) параметров объекта и строки соответственно.

В этом нет ничего плохого.