Рассмотрим следующую программу:
public class GenericTypeInference {
public static void main(String[] args) {
print(new SillyGenericWrapper().get());
}
private static void print(Object object) {
System.out.println("Object");
}
private static void print(String string) {
System.out.println("String");
}
public static class SillyGenericWrapper {
public <T> T get() {
return null;
}
}
}
Он печатает "String" под Java 8 и "Object" в Java 7.
Я ожидал, что это будет двусмысленность в Java 8, потому что оба перегруженных метода совпадают. Почему компилятор выбирает print(String)
после JEP 101?
Обоснованный или нет, это нарушает обратную совместимость, и изменение не может быть обнаружено во время компиляции. Код просто скрытно ведет себя по-разному после перехода на Java 8.
ПРИМЕЧАНИЕ: SillyGenericWrapper
поистине назван "глупым". Я пытаюсь понять, почему компилятор ведет себя так, как он это делает, не говорите мне, что глупая обертка - это плохой дизайн в первую очередь.
UPDATE: я также попытался скомпилировать и запустить пример в Java 8, но с использованием уровня языка Java 7. Поведение соответствовало Java 7. Это ожидалось, но я все еще чувствовал необходимость проверки.