Что касается того, как убедиться, что вы вызываете метод производного класса, который переопределяет базу, то есть нативное поведение Java.
Пример программы:
public class Foo {
static class A {
int get() { return 0; }
}
static class B extends A {
@Override
int get() { return 1; }
}
public static void main(final String[] args)
{
A a = new A();
B b1 = new B();
A b2 = new B();
printA(a);
printA(b1);
printA(b2);
}
public static <T extends A> void printA(T bObj) {
System.out.println(bObj.get());
}
}
Вывод:
0
1
1
Обратите внимание, что выходные данные, возвращаемые из b2 :: get () :: int, совпадают с b1 :: get () :: int, даже если b2 - это тип A, а b1 - это тип B. Этопотому что, хотя у нас есть только ссылка на класс A в b2, реализация объекта по-прежнему B.