Extract generic type of root class either from the target base class or from target base interface.
Examples:
1. Foo implements IFoo[Integer]:
genericTypeOf(Foo.class, Object.class, IFoo.class) returns Integer
2. Foo extends BaseFoo[String]:
genericTypeOf(Foo.class, BaseFoo.class, IFoo.class) returns String
3. Foo extends BaseFoo; BaseFoo implements IFoo[String]:
genericTypeOf(Foo.class, BaseFoo.class, Object.class) returns String
Does not support nested generics, only supports single type parameter.