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;
  }
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 ; }
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