The first two are identical in effect. Casting is unnecessary.
If you want the map to contain a mixture of child classes, you need to declare
Map<String,Parent>
If you declare
Map<String,T extends Parent>
it declares a map from String to one particular child class of type T. The type parameter will need to be specified elsewhere (as a type parameter to the containing class or to an enclosing method). Note that you cannot instantiate a Map of an unbound type. Thus, for instance:
Map<String,? extends Parent> = new HashMap<String, ? extends Parent>();
generates a compiler error. The best you could do is:
Map<String,? extends Parent> = new HashMap<String, Parent>();
in which case you might as well stick with
Map<String,Parent> = new HashMap<String, Parent>();