Clases abstractas de Java que lanzan

Si tengo una clase abstracta con la siguiente función -

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

Y luego otra clase que extiende la clase abstracta e implementa su propia versión de foo -

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

¿Creará esto problemas? Específicamente en el siguiente caso de prueba:

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

Hice algunas pruebas y no parece que se haya roto nada, pero no entiendo por qué se llamó Foo de B y no A

Respuestas a la pregunta(4)

Su respuesta a la pregunta