Your List may be a List<Child>, but it's reference type is List<? super Dog>. Which means that at line 19, as far as the compiler is concerned, it could be a List<Dog>. And the method won't accept one of those, will it?
When using generic wildcards, the important thing to remember is that the compiler will only allow things it can guarantee to be safe.