Consider this example (typical in OOP books):
I have an Animal class, where each Animal can have many friends. And subclasses like
Animal
Not really, because as you say, the compiler only knows that callFriend() is returning an Animal, not a Dog or Duck.
Can you not add an abstract makeNoise() method to Animal that would be implemented as a bark or quack by its subclasses?