code: private void init(Class<?> type) {
  
      ParameterizedType parameterizedType =
        stream(nullSafeArray(type.getGenericInterfaces(), Type.class))
          .filter(this::isParameterizedFunctionType)
          .findFirst()
          .map(it -> (ParameterizedType) it)
          .orElseGet(() -> {
  
            Type genericSuperclass = type.getGenericSuperclass();
  
            return isParameterizedFunctionType(genericSuperclass) ? (ParameterizedType) genericSuperclass : null;
  
          });
  
      this.sourceType = parameterizedType != null
        ? ClassUtils.toRawType(parameterizedType.getActualTypeArguments()[0])
        : Object.class;
  
      this.targetType = parameterizedType != null
        ? ClassUtils.toRawType(parameterizedType.getActualTypeArguments()[1])
        : Object.class;
    }
docs: Initializes the {@link Class source} and {@link Class target} types of the data conversion
  performed by this {@link Converter}.
  
  @param type {@link Class} to evaluate for source and target {@link Class types}.
  @see java.lang.Class