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;
 }