Рассмотрим следующие 4 метода
Java code bytecode
m1: Byte f(List<Byte> list) f List -> Byte
m2: Long f(List<Byte> list) f List -> Long
m3: Byte f(List<Long> list) f List -> Byte
m4: Long f(List<Long> list) f List -> Long
В соответствии с текущей спецификацией языка Java,
m1 и m2 не могут сосуществовать, равно как и m3 и m4. потому что они имеют одинаковые типы параметров.
m1 и m3 могут сосуществовать, как и m1 и m4. потому что они имеют разные типы параметров.
Но javac 6 допускает только m1 + m4, но не m1 + m3. Это связано с представлением методов в виде байт-кода, которое включает типы возвращаемых данных. Следовательно, m1 + m4 в порядке, но не m1 + m3.
Это ошибка, из-за которой спецификации Java и JVM не видны с глазу на глаз. Не существует «правильного» пути для javac.
Хотя это отстой, хорошая новость заключается в том, что перегрузка - это тщеславие, а не необходимость. Мы всегда можем использовать разные, более описательные и разные имена для этих методов.