private static Type replaceTypeActualArgument(Type inType, final Map<Type, Type> resolvedTypes) {
        Type outType = inType;

        if (inType instanceof ParameterizedType) {
            final ParameterizedType finalType = ((ParameterizedType) inType);
            final Type[] actualArgs = ((ParameterizedType) inType).getActualTypeArguments();

            for (int i = 0; i < actualArgs.length; i++) {
                Type argType = actualArgs[i];
                while (resolvedTypes.containsKey(argType)) {
                    argType = resolvedTypes.get(argType);
                }

                // Do replace ActualArgument
                argType = replaceTypeActualArgument(argType, resolvedTypes);

                actualArgs[i] = argType;
            }

            outType = new ParameterizeTypeActualArgsDelegate(finalType, actualArgs);
        }
        return outType;
    }
Replace {@link ParameterizedType#getActualTypeArguments()} method return value.
In this we use {@link ParameterizeTypeActualArgsDelegate} delegate {@link ParameterizedType};
Let {@link ParameterizedType#getActualTypeArguments()} return really class type.

@param inType        Type
@param resolvedTypes a Map<Type, Type>, {@link #getActualTypeArguments(Class, Class)}
@return {@link ParameterizeTypeActualArgsDelegate}
caprice/kit-reflect/src/main/java/net/qiujuer/genius/kit/reflect/Reflector.java