From a7897ca8c38a63f78ea4b562a166d268b95d69fa Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Thu, 18 Sep 2014 09:30:31 +0200 Subject: [PATCH] Remove unchecked behaviour in MathUtils.cast -use dynamic casting to ensure typesafety -shortcircuit if the Number already has the desired type --- .../main/java/com/mysema/util/MathUtils.java | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/util/MathUtils.java b/querydsl-core/src/main/java/com/mysema/util/MathUtils.java index 223a80ca6..2fcb05b96 100644 --- a/querydsl-core/src/main/java/com/mysema/util/MathUtils.java +++ b/querydsl-core/src/main/java/com/mysema/util/MathUtils.java @@ -38,38 +38,33 @@ public final class MathUtils { return MathUtils.cast(res, (Class)num1.getClass()); } - @SuppressWarnings("unchecked") public static D cast(Number num, Class type) { - Number rv; - if (type.equals(Byte.class)) { - rv = num.byteValue(); + D rv; + if (type.isInstance(num)) { + rv = type.cast(num); + } else if (type.equals(Byte.class)) { + rv = type.cast(num.byteValue()); } else if (type.equals(Double.class)) { - rv = num.doubleValue(); + rv = type.cast(num.doubleValue()); } else if (type.equals(Float.class)) { - rv = num.floatValue(); + rv = type.cast(num.floatValue()); } else if (type.equals(Integer.class)) { - rv = num.intValue(); + rv = type.cast(num.intValue()); } else if (type.equals(Long.class)) { - rv = num.longValue(); + rv = type.cast(num.longValue()); } else if (type.equals(Short.class)) { - rv = num.shortValue(); + rv = type.cast(num.shortValue()); } else if (type.equals(BigDecimal.class)) { - if (num instanceof BigDecimal) { - rv = num; - } else { - rv = new BigDecimal(num.toString()); - } + rv = type.cast(new BigDecimal(num.toString())); } else if (type.equals(BigInteger.class)) { - if (num instanceof BigInteger) { - rv = num; - } else if (num instanceof BigDecimal) { - rv = ((BigDecimal)num).toBigInteger(); + if (num instanceof BigDecimal) { + rv = type.cast(((BigDecimal) num).toBigInteger()); } else { - rv = new BigInteger(num.toString()); + rv = type.cast(new BigInteger(num.toString())); } } else { throw new IllegalArgumentException(String.format("Illegal type : %s", type.getSimpleName())); } - return (D) rv; + return rv; } }