Generics tracking

Tracking is a reverse process to generics resolution: when you know some type's generics and you want to calculate generics of some root type.

class Base<T> {

}

class Root<K, P extends Comparable> extends Base<K[]> {}

Suppose we know Base<String[]> and we want to track Root class generics:

GenericsTrackingUtils.track(Root, Base, ["T": String[]]) 
                        == ["K": String, "P": Comparable]

Here we don't have any connection from root generic "P" and base class, so its resolved by raw declaration (as declared upper bound).