code: public boolean isAssignableTo(TypeDescriptor typeDescriptor) {
  		boolean typesAssignable = typeDescriptor.getObjectType().isAssignableFrom(getObjectType());
  		if (!typesAssignable) {
  			return false;
  		}
  		if (isArray() && typeDescriptor.isArray()) {
  			return getElementTypeDescriptor().isAssignableTo(typeDescriptor.getElementTypeDescriptor());
  		}
  		else if (isCollection() && typeDescriptor.isCollection()) {
  			return isNestedAssignable(getElementTypeDescriptor(), typeDescriptor.getElementTypeDescriptor());
  		}
  		else if (isMap() && typeDescriptor.isMap()) {
  			return isNestedAssignable(getMapKeyTypeDescriptor(), typeDescriptor.getMapKeyTypeDescriptor()) &&
  				isNestedAssignable(getMapValueTypeDescriptor(), typeDescriptor.getMapValueTypeDescriptor());
  		}
  		else {
  			return true;
  		}
  	}
docs: Returns true if an object of this type descriptor can be assigned to the location described by the given type descriptor.
  <p>For example, valueOf(String.class).isAssignableTo(valueOf(CharSequence.class)) returns true because a String value can be assigned to a CharSequence variable.
  On the other hand, valueOf(Number.class).isAssignableTo(valueOf(Integer.class)) returns false because, while all Integers are Numbers, not all Numbers are Integers.
  <p>
  For arrays, collections, and maps, element and key/value types are checked if declared.
  For example, a List&lt;String&gt; field value is assignable to a Collection&lt;CharSequence&gt; field, but List&lt;Number&gt; is not assignable to List&lt;Integer&gt;.
  @return true if this type is assignable to the type represented by the provided type descriptor
  @see #getObjectType()