private static <N extends Number> N scale(Class<N> type, double value, N min, N max) { if (type.isAssignableFrom(Integer.class)) return type.cast(Integer.valueOf((int) (value * max.intValue() + min.intValue()))); if (type.isAssignableFrom(Double.class)) return type.cast((value * max.doubleValue() + min.doubleValue())); if (type.isAssignableFrom(Long.class)) return type.cast(Long.valueOf((long) (value * max.longValue() + min.longValue()))); if (type.isAssignableFrom(Short.class)) return type.cast(Short.valueOf((short) (value * max.shortValue() + min.shortValue()))); if (type.isAssignableFrom(Byte.class)) return type.cast(Byte.valueOf((byte) (value * max.byteValue() + min.byteValue()))); if (type.isAssignableFrom(Float.class)) return type.cast(Float.valueOf((float) (value * max.floatValue() + min.floatValue()))); return null; }