Код должен вызывать вызывающего метода следующим образом:
public class A {
public void f1(A a){
if(a instanceof B)
((B) this).f1(a);
else
System.out.println("Nothing");
}
}
В своем коде вместо этого вы приводите только параметр.Результатом этого является рекурсивный вызов одного и того же метода того же класса.
Если вместо этого вы вызываете вызывающую функцию, вы сообщаете JVM, что вам нравится вызывать метод в подклассе, чтобы вы могли выйти из методанемедленно.
Важно Обратите внимание, что при вызове преобразования в вызывающем объекте в зависимости от параметра может генерироваться исключение преобразования класса, например, в следующем контексте:
B b = new B();
A a = new A();
a.f1(b);
Вы не можете быть уверены, что метод f1, принимающий параметр B, вызывается для объекта B .