Classes abstratas de Java que lançam

Se eu tiver uma classe abstrata com a seguinte função -

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

E então outra classe que estende a classe abstrata e implementa sua própria versão do foo -

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

Isso criará problemas? Especificamente no seguinte caso de teste -

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

Eu fiz alguns testes e nada parece ter quebrado, mas eu não entendo porque o foo de B foi chamado e não o A

questionAnswers(4)

yourAnswerToTheQuestion