Это еще один вопрос о методах с сигнатурами, использующими параметризованные типы в Java.
Скажем, у вас есть два следующих метода:
static void f(List<Integer> l) {}
static void f(List<String> l) {}
Компилятор будет жаловаться, что оба метода имеют одинаковыесигнатура после стирания типа (оба типа аргументов стираются до List
).
Многие похожие вопросы по stackoverflow задают, почему это так, но всегда вопрос касается экземпляров (не статических) методов (см. Метод имеет то же самое стирание, что и другой метод, например, типа .
Обычно половина ответов основана на следующем (очень неправильном) аргументе: компилятор стирает все параметры типа в байт-коде исделать методы неразличимыми. Хорошо, тогда просто напечатайте байт-код с помощью javap
, и вы увидите, все ли стерто! (хотя байт-код теряет много данных параметризации, полные сигнатуры методов фактически сохраняются, что, безусловно, полезно, когда вы хотите скомпилировать новый класс, используя зависимость, содержащую общие классы и методы).
С другой сторонылучшие ответы обычно цитируют JLS 8.4.2 и объясняют, что для совместимости со старыми пре-универсальными версиями Java (и необработанными типами в более новых версиях) методы с эквивалентными переопределением сигнатурами запрещены.
IЯ согласен с последним аргументом, за исключением того, что он означает что-то только для методов экземпляра (не статических), поскольку статические методы не могут быть переопределены в любом случае.
Возможно, есть аналогичное объяснение для статических методов, но я не могу точно определить его,Может ли кто-нибудь помочь мне понять это?