Разрешение перегрузки метода происходит во время компиляции.
Когда компилятор компилирует Gen<E>
, он ничего не знает о E
, то есть он не может гарантировать, что E
расширяет A
поэтому он должен вызвать перегрузку test
с <E>
.
Если вы удалите эту перегрузку test()
, вы получите ошибку компиляции, так как другая вообще не совместима :
The method test(E extends A) in the type Test is not applicable for the arguments (E)
Чтобы он вызывал другого, измените на Gen<E extends A>
.