Когда вы используете дженерики или имеете ко-вариантный тип возврата (я подозреваю, что последний здесь), компилятор генерирует дополнительный метод для поддержки обратной совместимости и наследования.
На уровне JVM возвращаемый тип является частью сигнатуры метода (даже если это не в Java)
Скажем, у вас есть этот код
public class A {
public Number method() { return 1L; }
}
public class B extends A {
public Double method() { return 2.0; }
}
В JVM Number method()
не переопределяется Double method()
, поскольку сигнатуры различны, поэтому компилятор javac добавляет метод в байт-код, такой как
public class B extends A {
public transient Number method() { return (Number)<Double>method(); } // calls the first method
public Double method() { return 2.0; }
}
Этот сгенерированный метод не имеет источника и условно помещается в строку 1 в вашем исходном файле. (Я не уверен, почему метод имеет тот же модификатор, что и переходное поле)