Abstrakcyjne klasy Java, które rzucają

Jeśli mam klasę abstrakcyjną z następującą funkcją -

abstract class A{
    void foo(String s) throws Exception{
        throw new Exception("exception!");
    }
}

A potem kolejna klasa, która rozszerza klasę abstrakcyjną i implementuje własną wersję foo -

class B extends A{
    void foo(String s){
        //do stuff that does *not* throw an exception
    }
}

Czy to spowoduje problemy? Szczególnie w następującym przypadku testowym -

Collection<A> col = new Collection<A>();
B b = new B();
col.add(b);
for(A a : col){
    a.foo();
}

Zrobiłem kilka testów i nic się nie zepsuło, ale nie rozumiem, dlaczego foo B zostało wywołane, a nie A

questionAnswers(4)

yourAnswerToTheQuestion