/**
   * Tell whether this numeric type can be stored into from the given type.
   *
   * @param thisType The TypeId of this type
   * @param otherType The TypeId of the other type.
   * @param cf A ClassFactory
   */
  public boolean numberStorable(TypeId thisType, TypeId otherType, ClassFactory cf) {
    /*
     ** Numbers can be stored into from other number types.
     ** Also, user types with compatible classes can be stored into numbers.
     */
    if ((otherType.isNumericTypeId()) || (otherType.isBooleanTypeId())) return true;

    /*
     ** If the other type is user-defined, use the java types to determine
     ** assignability.
     */
    return userTypeStorable(thisType, otherType, cf);
  }
  /**
   * Tell whether this numeric type can be converted to the given type.
   *
   * @param otherType The TypeId of the other type.
   * @param forDataTypeFunction was this called from a scalarFunction like CHAR() or DOUBLE()
   */
  public boolean numberConvertible(TypeId otherType, boolean forDataTypeFunction) {

    // Can't convert numbers to long types
    if (otherType.isLongConcatableTypeId()) return false;

    // Numbers can only be converted to other numbers,
    // and CHAR, (not VARCHARS or LONGVARCHAR).
    // Only with the CHAR() or VARCHAR()function can they be converted.
    boolean retval =
        ((otherType.isNumericTypeId()) || (otherType.isBooleanTypeId()) || (otherType.userType()));

    // For CHAR  Conversions, function can convert
    // Floating types
    if (forDataTypeFunction)
      retval = retval || (otherType.isFixedStringTypeId() && (getTypeId().isFloatingPointTypeId()));

    retval = retval || (otherType.isFixedStringTypeId() && (!getTypeId().isFloatingPointTypeId()));

    return retval;
  }