Когда вы вызываете u.pubMethod(1)
, компилятор рассматривает только сигнатуры методов класса Parent
, поскольку Parent
является типом типа компиляции u
. Так как public String pubMethod(Integer i)
является единственным методом Parent
, имеющим требуемое имя, это выбранный метод. public String pubMethod(int i)
из Child
класса не рассматривается в качестве кандидата, поскольку Parent
не имеет метода такой подписи.
Во время выполнения метод подкласса public String pubMethod(int i)
не может переопределить метод суперкласса public String pubMethod(Integer i)
, поскольку он имеет другую сигнатуру. Поэтому выполняется метод класса Parent
.
Чтобы класс Child
был выполнен, вы должны либо изменить его сигнатуру, чтобы она соответствовала сигнатуре метода класса Parent
, что позволит ему переопределить метод класса Parent
:
public class Child extends Parent {
@Override
public String pubMethod(Integer i) {
return "c";
}
}
Или вы можете добавить второй метод к классу Parent
, который будет переопределен существующим методом класса Child
:
class Parent {
public String pubMethod(Integer i) {
return "pInteger";
}
public String pubMethod(int i) {
return "pint";
}
}
В первом случае компилятор по-прежнему будет выбирать один метод - public String pubMethod(Integer i)
- но во время выполнения метод класса Child
переопределит его.
Во втором случае у компилятора будет два метода на выбор. Он выберет public String pubMethod(int i)
, так как тип литерала 1
равен int
. Во время выполнения метод Child
class public String pubMethod(int i)
переопределит его.