private static Number performConversion()

in gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java [724:772]


    private static Number performConversion(final Number a, final Class<? extends Number> clazz) {
        if (a.getClass().equals(clazz)) {
            return a;
        }
        if (clazz.equals(Integer.class)) {
            Long val = longValue(a, clazz);
            if (val >= Integer.MIN_VALUE && val <= Integer.MAX_VALUE) {
                return a.intValue();
            }
        } else if (clazz.equals(Long.class)) {
            return longValue(a, clazz);
        } else if (clazz.equals(Float.class)) {
            // BigDecimal or BigInteger to double can overflow into Infinity, we want to prevent this
            if (isInfinityOrNaN(a)) {
                return a.floatValue();
            }
            if (a.doubleValue() >= -Float.MAX_VALUE && a.doubleValue() <= Float.MAX_VALUE) {
                return a.floatValue();
            }
        } else if (clazz.equals(Double.class)) {
            // BigDecimal or BigInteger to double can overflow into Infinity, we want to prevent this
            if (isInfinityOrNaN(a)) {
                return a.doubleValue();
            }
            if (!Double.isInfinite(a.doubleValue())) {
                // float losses precision, use string intermediate
                return a.getClass().equals(Float.class) ? Double.parseDouble(a.toString()) : a.doubleValue();
            }
        } else if (clazz.equals(Byte.class)) {
            Long val = longValue(a, clazz);
            if (val >= Byte.MIN_VALUE && val <= Byte.MAX_VALUE) {
                return a.byteValue();
            }
        } else if (clazz.equals(Short.class)) {
            Long val = longValue(a, clazz);
            if (val >= Short.MIN_VALUE && val <= Short.MAX_VALUE) {
                return a.shortValue();
            }
        } else if (clazz.equals(BigInteger.class)) {
            return NumberHelper.bigIntegerValue(a);
        } else if (clazz.equals(BigDecimal.class)) {
            return NumberHelper.bigDecimalValue(a);
        } else {
            throw new IllegalArgumentException("Unsupported numeric type: " + clazz);
        }

        throw new ArithmeticException(String.format("Can't convert number of type %s to %s due to overflow.",
                a.getClass().getSimpleName(), clazz.getSimpleName()));
    }