Understanding Casting with Generics

With multiple level inheritance and polymorphism it can become a bit challenging to see how a method accepting and returning a generic would behave if within the method some transformation takes place and either a sub or super type of that generic is returned. Let’s take an example