in velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/TypeConversionHandlerImpl.java [658:691]
public Converter<?> getNeededConverter(Type formal, Class<?> actual)
{
if (actual == null)
{
return null;
}
Pair<String, String> key = Pair.of(formal.getTypeName(), actual.getTypeName());
/* first check for a standard conversion */
Converter<?> converter = standardConverterMap.get(key);
if (converter == null)
{
/* then the converters cache map */
converter = converterCacheMap.get(key);
if (converter == null)
{
Class<?> formalClass = IntrospectionUtils.getTypeClass(formal);
/* check for conversion towards string */
if (formal == String.class)
{
converter = toString;
}
/* check for String -> Enum constant conversion */
else if (formalClass != null && formalClass.isEnum() && actual == String.class)
{
final Class<Enum> enumClass = (Class<Enum>)formalClass;
converter = o -> Enum.valueOf(enumClass, (String)o);
}
converterCacheMap.put(key, converter == null ? cacheMiss : converter);
}
}
return converter == cacheMiss ? null : converter;
}