code: protected boolean isMergeAble(Class<?> targetType, Object other, Object target) {
      // don't merge a null value
      if (other == null) {
        return false;
      } else {
        // allow any non-null value to merge over a null target.
        if (target == null) {
          return true;
        }
      }
  
      // we know we have two objects with value.. Make sure the types are the same and
      // perform additional checks.
      if (!targetType.isAssignableFrom(target.getClass()) ||
          !targetType.isAssignableFrom(other.getClass())) {
        return false;
      }
  
      if (target instanceof Collection) {
        return !((Collection<?>) other).isEmpty();
      }
  
      if (target instanceof Map) {
        return !((Map<?, ?>) other).isEmpty();
      }
  
      return true;
    }
docs: Determines if one object can be merged onto another object. Checks for {@code null},
  and empty (Collections & Maps) to make decision.
  
  @param targetType The type that both {@code other} and {@code target} must be assignable to.
  @param other the object to merge. must be the same type as the 'target'.
  @param target the object to merge on to. must be the same type as the 'other'.
  @return whether the 'other' can be merged onto the 'target'.