class ParentTypeAwareTypeInformation<S> extends TypeDiscoverer<S> {

    private final TypeDiscoverer<?> parent;

    private int hashCode;

    /**
     * Creates a new {@link ParentTypeAwareTypeInformation}.
     *
     * @param type must not be {@code null}.
     * @param parent must not be {@code null}.
     * @param map must not be {@code null}.
     */
    protected ParentTypeAwareTypeInformation(Type type, TypeDiscoverer<?> parent, Map<TypeVariable<?>, Type> map) {

        super(type, mergeMaps(parent, map));
        this.parent = parent;
    }

    /**
     * Merges the type variable maps of the given parent with the new map.
     *
     * @param parent must not be {@code null}.
     * @param map must not be {@code null}.
     * @return
     */
    private static Map<TypeVariable<?>, Type> mergeMaps(TypeDiscoverer<?> parent, Map<TypeVariable<?>, Type> map) {

        Map<TypeVariable<?>, Type> typeVariableMap = new HashMap<TypeVariable<?>, Type>();
        typeVariableMap.putAll(map);
        typeVariableMap.putAll(parent.getTypeVariableMap());

        return typeVariableMap;
    }

    @Override
    protected TypeInformation<?> createInfo(Type fieldType) {

        if (parent.getType().equals(fieldType)) {
            return parent;
        }

        return super.createInfo(fieldType);
    }

    @Override
    public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

    @Override
    public int hashCode() {

        if (this.hashCode == 0) {
            this.hashCode = super.hashCode() + 31 * parent.hashCode();
        }

        return this.hashCode;
    }

}


        if (!super.equals(obj)) {
            return false;
        }

        if (!this.getClass().equals(obj.getClass())) {
            return false;
        }

        ParentTypeAwareTypeInformation<?> that = (ParentTypeAwareTypeInformation<?>) obj;
        return this.parent == null ? that.parent == null : this.parent.equals(that.parent);
    
<methods>public boolean equals(java.lang.Object) ,public TypeInformation<?> getActualType() ,public final TypeInformation<?> getComponentType() ,public java.lang.reflect.Type getGenericType() ,public TypeInformation<?> getMapValueType() ,public List<TypeInformation<?>> getParameterTypes(Constructor<?>) ,public List<TypeInformation<?>> getParameterTypes(java.lang.reflect.Method) ,public ClassTypeInformation<?> getRawTypeInformation() ,public TypeInformation<?> getReturnType(java.lang.reflect.Method) ,public TypeInformation<?> getSuperTypeInformation(Class<?>) ,public Class<S> getType() ,public TypeInformation<?> getTypeArgument(Class<?>, int) ,public List<TypeInformation<?>> getTypeArguments() ,public Map<TypeVariable<?>,java.lang.reflect.Type> getTypeVariableMap() ,public int hashCode() ,public boolean isAssignableFrom(TypeInformation<?>) ,public boolean isCollectionLike() ,public boolean isMap() <variables>private TypeInformation<?> componentType,private boolean componentTypeResolved,private final non-sealed int hashCode,private Class<S> resolvedType,private final non-sealed java.lang.reflect.Type type,private final non-sealed Map<TypeVariable<?>,java.lang.reflect.Type> typeVariableMap,private TypeInformation<?> valueType,private boolean valueTypeResolved