@SuppressWarnings("unchecked")
public <S, D> D convert(S source, Type<S> sourceType, Type<D> destinationType, String converterId) {
Converter<S, D> converter;
ConverterFactory converterFactory = mapperFactory.getConverterFactory();
if (converterId == null) {
final Type<? extends Object> sourceClass = normalizeSourceType(source, sourceType, destinationType);
converter = (Converter<S, D>) converterFactory.getConverter(sourceClass, destinationType);
} else {
converter = (Converter<S, D>) converterFactory.getConverter(converterId);
}
return converter.convert(source, destinationType);
}