package org.sglj.util;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Utility class which provides methods for converting one basic type to
* another.<br>
* There are two types of method for converting each type basic
* Java type to another one.
* The first variant return a wrapper class corresponding
* to the desired primitive type. The <code>null</code> return value
* indicates that the conversion fails.<br>
* The second variant returns a primitive in either case. If the conversion
* fails, the <tt>defaultValue</tt> is returned. The caller responsibility
* is to choose such <tt>defaultValue</tt> that those two cases can be
* distinguished.<br>
* There are also generic methods which convert any of the basic types
* to the specified type which is specified via parameter.
* Two types of generic methods for each of the basic types exists; the
* first one converts any basic type to that type and is prefixed
* with "to", and the second one converts that type to the specified type which
* wrapper object is provided.
*
* For example, to convert a string to equivalent integer use:
* <pre>
* Integer i = TypeConversionUtils.stringToInteger("123");
* </pre>
*
* This class also provides a generic method to convert some basic type
* to the primitive or its wrapper.
* Here are the examples:
* <pre>
* Integer i = TypeConversionUtils.stringToBasicType("123", Integer.class);
* </pre>
* Note that there is no need for casting.<br>
* Finally, here is the example how to convert a string to the corresponding
* basic type equal to the type of the object <tt>o</tt>:
* <pre>
* Object converted = TypeConversionUtils.stringToBasicType(s, o.getClass());
* </pre>
* <br>
* Note that the type conversion methods which could be done by "upcasting",
* such as shortToLong are missing because that conversion is always safe
* and is automatic in Java.<br>
* <br>
* All conversion methods which involve conversion from strings
* are done exactly by the way implemented in
* methods such as {@link Integer#parseInt(String)},
* {@link Boolean#parseBoolean(String)}. Methods which would require
* downcasting are implemented to succeed only if the argument is from
* the range [MIN_VALUE, MAX_VALUE], except the boolean conversion which
* is implemented like the one in the C programming language (all non-zero
* values are <code>true</code>).
*
* @author Leo Osvald
* @version 1.01
*/
public class TypeConversionUtils {
private static final Set<Class<?>> BASIC_TYPES;
private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER;
private static final Map<Class<?>, Class<?>> WRAPPER_PRIMITIVE;
static {
Set<Class<?>> basicTypes = new HashSet<Class<?>>(9);
basicTypes.add(Boolean.class);
basicTypes.add(Byte.class);
basicTypes.add(Character.class);
basicTypes.add(Short.class);
basicTypes.add(Integer.class);
basicTypes.add(Long.class);
basicTypes.add(Float.class);
basicTypes.add(Double.class);
basicTypes.add(String.class);
BASIC_TYPES = Collections.unmodifiableSet(basicTypes);
Map<Class<?>, Class<?>> wrapperPrimitive = new HashMap<Class<?>, Class<?>>(8);
wrapperPrimitive.put(Boolean.class, boolean.class);
wrapperPrimitive.put(Byte.class, byte.class);
wrapperPrimitive.put(Character.class, char.class);
wrapperPrimitive.put(Short.class, short.class);
wrapperPrimitive.put(Integer.class, int.class);
wrapperPrimitive.put(Long.class, long.class);
wrapperPrimitive.put(Float.class, float.class);
wrapperPrimitive.put(Double.class, double.class);
WRAPPER_PRIMITIVE = Collections.unmodifiableMap(wrapperPrimitive);
Map<Class<?>, Class<?>> primitiveWrapper = new HashMap<Class<?>, Class<?>>(8);
primitiveWrapper.put(boolean.class, Boolean.class);
primitiveWrapper.put(byte.class, Byte.class);
primitiveWrapper.put(char.class, Character.class);
primitiveWrapper.put(short.class, Short.class);
primitiveWrapper.put(int.class, Integer.class);
primitiveWrapper.put(long.class, Long.class);
primitiveWrapper.put(float.class, Float.class);
primitiveWrapper.put(double.class, Double.class);
PRIMITIVE_WRAPPER = Collections.unmodifiableMap(primitiveWrapper);
}
private TypeConversionUtils() {
}
// boolean conversion methods
public static boolean byteToBoolean(byte b) {
return b != 0 ? true : false;
}
public static boolean charToBoolean(char c) {
return c != 0 ? true : false;
}
public static boolean shortToBoolean(short h) {
return h != 0 ? true : false;
}
public static boolean intToBoolean(int i) {
return i != 0 ? true : false;
}
public static boolean longToBoolean(long l) {
return l != 0 ? true : false;
}
public static boolean floatToBoolean(float f) {
return f != 0 ? true : false;
}
public static boolean doubleToBoolean(double d) {
return d != 0 ? true : false;
}
public static byte booleanToByte(boolean b) {
return b ? (byte) 1 : 0;
}
public static char booleanToChar(boolean b) {
return b ? (char) 1 : 0;
}
public static short booleanToShort(boolean b) {
return b ? (short) 1 : 0;
}
public static int booleanToInt(boolean b) {
return b ? 1 : 0;
}
public static long booleanToLong(boolean b) {
return b ? 1L : 0L;
}
public static float booleanToFloat(boolean b) {
return b ? 1f : 0f;
}
public static double booleanToDouble(boolean b) {
return b ? 1. : 0.;
}
// standard type-to-type conversion (only downcasts)
public static Boolean stringToBoolean(String s) {
if (s == null)
return null;
try {
return Boolean.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Boolean toBoolean(Object o) {
if (o == null)
return null;
if (o.getClass() == Boolean.class)
return (Boolean) o;
if (o.getClass() == Byte.class)
return byteToBoolean(((Byte) o));
if (o.getClass() == Character.class)
return charToBoolean(((Character) o));
if (o.getClass() == Short.class)
return shortToBoolean(((Short) o));
if (o.getClass() == Integer.class)
return intToBoolean(((Integer) o));
if (o.getClass() == Long.class)
return longToBoolean(((Long) o));
if (o.getClass() == Float.class)
return floatToBoolean(((Float) o));
if (o.getClass() == Double.class)
return doubleToBoolean(((Double) o));
if (o.getClass() == String.class)
return stringToBoolean(((String) o));
return null;
}
public static Byte charToByte(char c) {
if (c >= Byte.MIN_VALUE && c <= Byte.MAX_VALUE) {
return (byte) c;
}
return null;
}
public static Byte shortToByte(short h) {
if (h >= Byte.MIN_VALUE && h <= Byte.MAX_VALUE) {
return (byte) h;
}
return null;
}
public static Byte intToByte(int i) {
if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) {
return (byte) i;
}
return null;
}
public static Byte longToByte(long l) {
if (l >= Byte.MIN_VALUE && l <= Byte.MAX_VALUE) {
return (byte) l;
}
return null;
}
public static Byte floatToByte(float f) {
if (f >= Byte.MIN_VALUE && f <= Byte.MAX_VALUE) {
return (byte) f;
}
return null;
}
public static Byte doubleToByte(double d) {
if (d >= Byte.MIN_VALUE && d <= Byte.MAX_VALUE) {
return (byte) d;
}
return null;
}
public static Byte stringToByte(String s) {
try {
return Byte.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Byte toByte(Object o) {
if (o == null)
return null;
if (o.getClass() == Byte.class)
return (Byte) o;
if (o.getClass() == Boolean.class)
return booleanToByte((Boolean) o);
if (o.getClass() == Character.class)
return charToByte((Character) o);
if (o.getClass() == Short.class)
return shortToByte((Short) o);
if (o.getClass() == Integer.class)
return intToByte((Integer) o);
if (o.getClass() == Long.class)
return longToByte((Long) o);
if (o.getClass() == Float.class)
return floatToByte((Float) o);
if (o.getClass() == Double.class)
return doubleToByte((Double) o);
if (o.getClass() == String.class)
return stringToByte((String) o);
return null;
}
public static Character shortToCharacter(short h) {
if (h >= Character.MIN_VALUE && h <= Character.MAX_VALUE) {
return (char) h;
}
return null;
}
public static Character intToCharacter(int i) {
if (i >= Character.MIN_VALUE && i <= Character.MAX_VALUE) {
return (char) i;
}
return null;
}
public static Character longToCharacter(long l) {
if (l >= Character.MIN_VALUE && l <= Character.MAX_VALUE) {
return (char) l;
}
return null;
}
public static Character floatToCharacter(float f) {
if (f >= Character.MIN_VALUE && f <= Character.MAX_VALUE) {
return (char) f;
}
return null;
}
public static Character doubleToCharacter(double d) {
if (d >= Character.MIN_VALUE && d <= Character.MAX_VALUE) {
return (char) d;
}
return null;
}
public static Character stringToCharacter(String s) {
if (s == null || s.length() != 1)
return null;
try {
return s.charAt(0);
} catch (IndexOutOfBoundsException e) {
return null;
}
}
public static Character toCharacter(Object o) {
if (o == null)
return null;
if (o.getClass() == Character.class)
return (Character) o;
if (o.getClass() == Boolean.class)
return booleanToChar((Boolean) o);
if (o.getClass() == Byte.class)
return (char) ((Byte) o).byteValue();
if (o.getClass() == Short.class)
return shortToCharacter((Short) o);
if (o.getClass() == Integer.class)
return intToCharacter((Integer) o);
if (o.getClass() == Long.class)
return longToCharacter((Long) o);
if (o.getClass() == Float.class)
return floatToCharacter((Float) o);
if (o.getClass() == Double.class)
return doubleToCharacter((Double) o);
if (o.getClass() == String.class)
return stringToCharacter((String) o);
return null;
}
public static Short intToShort(int i) {
if (i >= Short.MIN_VALUE && i <= Short.MAX_VALUE) {
return (short) i;
}
return null;
}
public static Short longToShort(long l) {
if (l >= Short.MIN_VALUE && l <= Short.MAX_VALUE) {
return (short) l;
}
return null;
}
public static Short floatToShort(float f) {
if (f >= Short.MIN_VALUE && f <= Short.MAX_VALUE) {
return (short) f;
}
return null;
}
public static Short doubleToShort(double d) {
if (d >= Short.MIN_VALUE && d <= Short.MAX_VALUE) {
return (short) d;
}
return null;
}
public static Short stringToShort(String s) {
try {
return Short.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Short toShort(Object o) {
if (o == null)
return null;
if (o.getClass() == Short.class)
return (Short) o;
if (o.getClass() == Boolean.class)
return booleanToShort((Boolean) o);
if (o.getClass() == Byte.class)
return (short) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (short) ((Character) o).charValue();
if (o.getClass() == Integer.class)
return intToShort((Integer) o);
if (o.getClass() == Long.class)
return longToShort((Long) o);
if (o.getClass() == Float.class)
return floatToShort((Float) o);
if (o.getClass() == Double.class)
return doubleToShort((Double) o);
if (o.getClass() == String.class)
return stringToShort((String) o);
return null;
}
public static Integer longToInteger(long l) {
if (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
return (int) l;
}
return null;
}
public static Integer floatToInteger(float f) {
if (f >= Integer.MIN_VALUE && f <= Integer.MAX_VALUE) {
return (int) f;
}
return null;
}
public static Integer doubleToInteger(double d) {
if (d >= Integer.MIN_VALUE && d <= Integer.MAX_VALUE) {
return (int) d;
}
return null;
}
public static Integer stringToInteger(String s) {
try {
return Integer.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Integer toInteger(Object o) {
if (o == null)
return null;
if (o.getClass() == Integer.class)
return (Integer) o;
if (o.getClass() == Boolean.class)
return booleanToInt((Boolean) o);
if (o.getClass() == Byte.class)
return (int) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (int) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (int) ((Short) o).shortValue();
if (o.getClass() == Long.class)
return longToInteger((Long) o);
if (o.getClass() == Float.class)
return floatToInteger((Float) o);
if (o.getClass() == Double.class)
return doubleToInteger((Double) o);
if (o.getClass() == String.class)
return stringToInteger((String) o);
return null;
}
public static Long floatToLong(float f) {
if (f >= Long.MIN_VALUE && f <= Long.MAX_VALUE) {
return (long) f;
}
return null;
}
public static Long doubleToLong(double d) {
if (d >= Long.MIN_VALUE && d <= Long.MAX_VALUE) {
return (long) d;
}
return null;
}
public static Long stringToLong(String s) {
try {
return Long.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Long toLong(Object o) {
if (o == null)
return null;
if (o.getClass() == Long.class)
return (Long) o;
if (o.getClass() == Boolean.class)
return booleanToLong((Boolean) o);
if (o.getClass() == Byte.class)
return (long) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (long) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (long) ((Short) o).shortValue();
if (o.getClass() == Integer.class)
return (long) ((Integer) o).intValue();
if (o.getClass() == Float.class)
return floatToLong((Float) o);
if (o.getClass() == Double.class)
return doubleToLong((Double) o);
if (o.getClass() == String.class)
return stringToLong((String) o);
return null;
}
public static Float doubleToFloat(double d) {
if (d >= Float.MIN_VALUE && d <= Float.MAX_VALUE) {
return (float) d;
}
return null;
}
public static Float stringToFloat(String s) {
if (s == null)
return null;
try {
return Float.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Float toFloat(Object o) {
if (o == null)
return null;
if (o.getClass() == Float.class)
return (Float) o;
if (o.getClass() == Boolean.class)
return booleanToFloat((Boolean) o);
if (o.getClass() == Byte.class)
return (float) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (float) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (float) ((Short) o).shortValue();
if (o.getClass() == Integer.class)
return (float) ((Integer) o).intValue();
if (o.getClass() == Long.class)
return (float) ((Long) o).longValue();
if (o.getClass() == Double.class)
return doubleToFloat((Double) o);
if (o.getClass() == String.class)
return stringToFloat((String) o);
return null;
}
public static Double stringToDouble(String s) {
if (s == null)
return null;
try {
return Double.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
public static Double toDouble(Object o) {
if (o == null)
return null;
if (o.getClass() == Double.class)
return (Double) o;
if (o.getClass() == Boolean.class)
return booleanToDouble((Boolean) o);
if (o.getClass() == Byte.class)
return (double) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (double) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (double) ((Short) o).shortValue();
if (o.getClass() == Integer.class)
return (double) ((Integer) o).intValue();
if (o.getClass() == Long.class)
return (double) ((Long) o).longValue();
if (o.getClass() == Float.class)
return (double) ((Float) o).floatValue();
if (o.getClass() == String.class)
return stringToDouble((String) o);
return null;
}
// methods which return primitives
public static boolean stringToBoolean(String s, boolean defaultValue) {
if (s == null)
return defaultValue;
try {
return Boolean.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static boolean toBoolean(Object o, boolean defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Boolean.class)
return (Boolean) o;
if (o.getClass() == Byte.class)
return byteToBoolean(((Byte) o));
if (o.getClass() == Character.class)
return charToBoolean(((Character) o));
if (o.getClass() == Short.class)
return shortToBoolean(((Short) o));
if (o.getClass() == Integer.class)
return intToBoolean(((Integer) o));
if (o.getClass() == Long.class)
return longToBoolean(((Long) o));
if (o.getClass() == Float.class)
return floatToBoolean(((Float) o));
if (o.getClass() == Double.class)
return doubleToBoolean(((Double) o));
if (o.getClass() == String.class)
return stringToBoolean(((String) o), defaultValue);
return defaultValue;
}
public static byte charToByte(char c, byte defaultValue) {
if (c >= Byte.MIN_VALUE && c <= Byte.MAX_VALUE) {
return (byte) c;
}
return defaultValue;
}
public static byte shortToByte(short h, byte defaultValue) {
if (h >= Byte.MIN_VALUE && h <= Byte.MAX_VALUE) {
return (byte) h;
}
return defaultValue;
}
public static byte intToByte(int i, byte defaultValue) {
if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) {
return (byte) i;
}
return defaultValue;
}
public static byte longToByte(long l, byte defaultValue) {
if (l >= Byte.MIN_VALUE && l <= Byte.MAX_VALUE) {
return (byte) l;
}
return defaultValue;
}
public static byte floatToByte(float f, byte defaultValue) {
if (f >= Byte.MIN_VALUE && f <= Byte.MAX_VALUE) {
return (byte) f;
}
return defaultValue;
}
public static byte doubleToByte(double d, byte defaultValue) {
if (d >= Byte.MIN_VALUE && d <= Byte.MAX_VALUE) {
return (byte) d;
}
return defaultValue;
}
public static byte stringToByte(String s, byte defaultValue) {
try {
return Byte.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static byte toByte(Object o, byte defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Byte.class)
return (Byte) o;
if (o.getClass() == Boolean.class)
return booleanToByte((Boolean) o);
if (o.getClass() == Character.class)
return charToByte((Character) o, defaultValue);
if (o.getClass() == Short.class)
return shortToByte((Short) o, defaultValue);
if (o.getClass() == Integer.class)
return intToByte((Integer) o, defaultValue);
if (o.getClass() == Long.class)
return longToByte((Long) o, defaultValue);
if (o.getClass() == Float.class)
return floatToByte((Float) o, defaultValue);
if (o.getClass() == Double.class)
return doubleToByte((Double) o, defaultValue);
if (o.getClass() == String.class)
return stringToByte((String) o, defaultValue);
return defaultValue;
}
public static char shortToChar(short h, char defaultValue) {
if (h >= Character.MIN_VALUE && h <= Character.MAX_VALUE) {
return (char) h;
}
return defaultValue;
}
public static char intToChar(int i, char defaultValue) {
if (i >= Character.MIN_VALUE && i <= Character.MAX_VALUE) {
return (char) i;
}
return defaultValue;
}
public static char longToChar(long l, char defaultValue) {
if (l >= Character.MIN_VALUE && l <= Character.MAX_VALUE) {
return (char) l;
}
return defaultValue;
}
public static char floatToChar(float f, char defaultValue) {
if (f >= Character.MIN_VALUE && f <= Character.MAX_VALUE) {
return (char) f;
}
return defaultValue;
}
public static char doubleToChar(double d, char defaultValue) {
if (d >= Character.MIN_VALUE && d <= Character.MAX_VALUE) {
return (char) d;
}
return defaultValue;
}
public static char stringToChar(String s, char defaultValue) {
if (s == null || s.length() != 1)
return defaultValue;
try {
return s.charAt(0);
} catch (IndexOutOfBoundsException e) {
return defaultValue;
}
}
public static char toChar(Object o, char defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Character.class)
return (Character) o;
if (o.getClass() == Boolean.class)
return booleanToChar((Boolean) o);
if (o.getClass() == Byte.class)
return (char) ((Byte) o).byteValue();
if (o.getClass() == Short.class)
return shortToChar((Short) o, defaultValue);
if (o.getClass() == Integer.class)
return intToChar((Integer) o, defaultValue);
if (o.getClass() == Long.class)
return longToChar((Long) o, defaultValue);
if (o.getClass() == Float.class)
return floatToChar((Float) o, defaultValue);
if (o.getClass() == Double.class)
return doubleToChar((Double) o, defaultValue);
if (o.getClass() == String.class)
return stringToChar((String) o, defaultValue);
return defaultValue;
}
public static short intToShort(int i, short defaultValue) {
if (i >= Short.MIN_VALUE && i <= Short.MAX_VALUE) {
return (short) i;
}
return defaultValue;
}
public static short longToShort(long l, short defaultValue) {
if (l >= Short.MIN_VALUE && l <= Short.MAX_VALUE) {
return (short) l;
}
return defaultValue;
}
public static short floatToShort(float f, short defaultValue) {
if (f >= Short.MIN_VALUE && f <= Short.MAX_VALUE) {
return (short) f;
}
return defaultValue;
}
public static short doubleToShort(double d, short defaultValue) {
if (d >= Short.MIN_VALUE && d <= Short.MAX_VALUE) {
return (short) d;
}
return defaultValue;
}
public static short stringToShort(String s, short defaultValue) {
try {
return Short.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static short toShort(Object o, short defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Short.class)
return (Short) o;
if (o.getClass() == Boolean.class)
return booleanToShort((Boolean) o);
if (o.getClass() == Byte.class)
return (short) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (short) ((Character) o).charValue();
if (o.getClass() == Integer.class)
return intToShort((Integer) o, defaultValue);
if (o.getClass() == Long.class)
return longToShort((Long) o, defaultValue);
if (o.getClass() == Float.class)
return floatToShort((Float) o, defaultValue);
if (o.getClass() == Double.class)
return doubleToShort((Double) o, defaultValue);
if (o.getClass() == String.class)
return stringToShort((String) o, defaultValue);
return defaultValue;
}
public static int longToInt(long l, int defaultValue) {
if (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
return (int) l;
}
return defaultValue;
}
public static int floatToInt(float f, int defaultValue) {
if (f >= Integer.MIN_VALUE && f <= Integer.MAX_VALUE) {
return (int) f;
}
return defaultValue;
}
public static int doubleToInt(double d, int defaultValue) {
if (d >= Integer.MIN_VALUE && d <= Integer.MAX_VALUE) {
return (int) d;
}
return defaultValue;
}
public static int stringToInt(String s, int defaultValue) {
try {
return Integer.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static int toInt(Object o, int defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Integer.class)
return (Integer) o;
if (o.getClass() == Boolean.class)
return booleanToInt((Boolean) o);
if (o.getClass() == Byte.class)
return (int) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (int) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (int) ((Short) o).shortValue();
if (o.getClass() == Long.class)
return longToInt((Long) o, defaultValue);
if (o.getClass() == Float.class)
return floatToInt((Float) o, defaultValue);
if (o.getClass() == Double.class)
return doubleToInt((Double) o, defaultValue);
if (o.getClass() == String.class)
return stringToInt((String) o, defaultValue);
return defaultValue;
}
public static long floatToLong(float f, long defaultValue) {
if (f >= Long.MIN_VALUE && f <= Long.MAX_VALUE) {
return (long) f;
}
return defaultValue;
}
public static long doubleToLong(double d, long defaultValue) {
if (d >= Long.MIN_VALUE && d <= Long.MAX_VALUE) {
return (long) d;
}
return defaultValue;
}
public static long stringToLong(String s, long defaultValue) {
try {
return Long.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static long toLong(Object o, long defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Long.class)
return (Long) o;
if (o.getClass() == Boolean.class)
return booleanToLong((Boolean) o);
if (o.getClass() == Byte.class)
return (long) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (long) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (long) ((Short) o).shortValue();
if (o.getClass() == Integer.class)
return (long) ((Integer) o).intValue();
if (o.getClass() == Float.class)
return floatToLong((Float) o, defaultValue);
if (o.getClass() == Double.class)
return doubleToLong((Double) o, defaultValue);
if (o.getClass() == String.class)
return stringToLong((String) o, defaultValue);
return defaultValue;
}
public static float doubleToFloat(double d, float defaultValue) {
if (d >= Float.MIN_VALUE && d <= Float.MAX_VALUE) {
return (float) d;
}
return defaultValue;
}
public static float stringToFloat(String s, float defaultValue) {
if (s == null)
return defaultValue;
try {
return Float.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static float toFloat(Object o, float defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Float.class)
return (Float) o;
if (o.getClass() == Boolean.class)
return booleanToFloat((Boolean) o);
if (o.getClass() == Byte.class)
return (float) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (float) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (float) ((Short) o).shortValue();
if (o.getClass() == Integer.class)
return (float) ((Integer) o).intValue();
if (o.getClass() == Long.class)
return (float) ((Long) o).longValue();
if (o.getClass() == Double.class)
return doubleToFloat((Double) o, defaultValue);
if (o.getClass() == String.class)
return stringToFloat((String) o, defaultValue);
return defaultValue;
}
public static double stringToDouble(String s, double defaultValue) {
if (s == null)
return defaultValue;
try {
return Double.valueOf(s);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static double toDouble(Object o, double defaultValue) {
if (o == null)
return defaultValue;
if (o.getClass() == Double.class)
return (Double) o;
if (o.getClass() == Boolean.class)
return booleanToDouble((Boolean) o);
if (o.getClass() == Byte.class)
return (double) ((Byte) o).byteValue();
if (o.getClass() == Character.class)
return (double) ((Character) o).charValue();
if (o.getClass() == Short.class)
return (double) ((Short) o).shortValue();
if (o.getClass() == Integer.class)
return (double) ((Integer) o).intValue();
if (o.getClass() == Long.class)
return (double) ((Long) o).longValue();
if (o.getClass() == Float.class)
return (double) ((Float) o).floatValue();
if (o.getClass() == String.class)
return stringToDouble((String) o, defaultValue);
return defaultValue;
}
// generic methods
@SuppressWarnings("unchecked")
public static <T> T booleanToBasicType(boolean b, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(b);
if (clazz.equals(Byte.class))
return (T) Byte.valueOf(booleanToByte(b));
if (clazz.equals(Character.class))
return (T) Character.valueOf(booleanToChar(b));
if (clazz.equals(Short.class))
return (T) Short.valueOf(booleanToShort(b));
if (clazz.equals(Integer.class))
return (T) Integer.valueOf(booleanToInt(b));
if (clazz.equals(Long.class))
return (T) Long.valueOf(booleanToLong(b));
if (clazz.equals(Float.class))
return (T) Float.valueOf(booleanToFloat(b));
if (clazz.equals(Double.class))
return (T) Double.valueOf(booleanToDouble(b));
if (clazz.equals(String.class))
return (T) String.valueOf(b);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T byteToBasicType(byte b, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(byteToBoolean(b));
if (clazz.equals(Byte.class))
return (T) Byte.valueOf(b);
if (clazz.equals(Character.class))
return (T) Character.valueOf((char) b);
if (clazz.equals(Short.class))
return (T) Short.valueOf(b);
if (clazz.equals(Integer.class))
return (T) Integer.valueOf(b);
if (clazz.equals(Long.class))
return (T) Long.valueOf(b);
if (clazz.equals(Float.class))
return (T) Float.valueOf(b);
if (clazz.equals(Double.class))
return (T) Double.valueOf(b);
if (clazz.equals(String.class))
return (T) String.valueOf(b);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T charToBasicType(char c, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(charToBoolean(c));
if (clazz.equals(Byte.class))
return (T) charToByte(c);
if (clazz.equals(Character.class))
return (T) Character.valueOf(c);
if (clazz.equals(Short.class))
return (T) Short.valueOf((short) c);
if (clazz.equals(Integer.class))
return (T) Integer.valueOf(c);
if (clazz.equals(Long.class))
return (T) Long.valueOf(c);
if (clazz.equals(Float.class))
return (T) Float.valueOf(c);
if (clazz.equals(Double.class))
return (T) Double.valueOf(c);
if (clazz.equals(String.class))
return (T) String.valueOf(c);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T shortToBasicType(short h, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(shortToBoolean(h));
if (clazz.equals(Byte.class))
return (T) shortToByte(h);
if (clazz.equals(Character.class))
return (T) shortToCharacter(h);
if (clazz.equals(Short.class))
return (T) Short.valueOf(h);
if (clazz.equals(Integer.class))
return (T) Integer.valueOf(h);
if (clazz.equals(Long.class))
return (T) Long.valueOf(h);
if (clazz.equals(Float.class))
return (T) Float.valueOf(h);
if (clazz.equals(Double.class))
return (T) Double.valueOf(h);
if (clazz.equals(String.class))
return (T) String.valueOf(h);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T intToBasicType(int i, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(intToBoolean(i));
if (clazz.equals(Byte.class))
return (T) intToByte(i);
if (clazz.equals(Character.class))
return (T) intToCharacter(i);
if (clazz.equals(Short.class))
return (T) intToShort(i);
if (clazz.equals(Integer.class))
return (T) Integer.valueOf(i);
if (clazz.equals(Long.class))
return (T) Long.valueOf(i);
if (clazz.equals(Float.class))
return (T) Float.valueOf(i);
if (clazz.equals(Double.class))
return (T) Double.valueOf(i);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T longToBasicType(long l, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(longToBoolean(l));
if (clazz.equals(Byte.class))
return (T) longToByte(l);
if (clazz.equals(Character.class))
return (T) longToCharacter(l);
if (clazz.equals(Short.class))
return (T) longToShort(l);
if (clazz.equals(Integer.class))
return (T) longToInteger(l);
if (clazz.equals(Long.class))
return (T) Long.valueOf(l);
if (clazz.equals(Float.class))
return (T) Float.valueOf(l);
if (clazz.equals(Double.class))
return (T) Double.valueOf(l);
if (clazz.equals(String.class))
return (T) String.valueOf(l);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T floatToBasicType(float f, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(floatToBoolean(f));
if (clazz.equals(Byte.class))
return (T) floatToByte(f);
if (clazz.equals(Character.class))
return (T) floatToCharacter(f);
if (clazz.equals(Short.class))
return (T) floatToShort(f);
if (clazz.equals(Integer.class))
return (T) floatToInteger(f);
if (clazz.equals(Long.class))
return (T) floatToLong(f);
if (clazz.equals(Float.class))
return (T) Float.valueOf(f);
if (clazz.equals(Double.class))
return (T) Double.valueOf(f);
if (clazz.equals(String.class))
return (T) String.valueOf(f);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T doubleToBasicType(double d, Class<T> clazz) {
if (clazz.equals(Boolean.class))
return (T) Boolean.valueOf(doubleToBoolean(d));
if (clazz.equals(Byte.class))
return (T) doubleToByte(d);
if (clazz.equals(Character.class))
return (T) doubleToCharacter(d);
if (clazz.equals(Short.class))
return (T) doubleToShort(d);
if (clazz.equals(Integer.class))
return (T) doubleToInteger(d);
if (clazz.equals(Long.class))
return (T) doubleToLong(d);
if (clazz.equals(Float.class))
return (T) doubleToFloat(d);
if (clazz.equals(Double.class))
return (T) Double.valueOf(d);
if (clazz.equals(String.class))
return (T) String.valueOf(d);
return null;
}
@SuppressWarnings("unchecked")
public static <T> T stringToBasicType(String s, Class<T> clazz) {
if (s == null)
return null;
if (clazz.equals(Boolean.class))
return (T) stringToBoolean(s);
if (clazz.equals(Byte.class))
return (T) stringToByte(s);
if (clazz.equals(Character.class))
return (T) stringToCharacter(s);
if (clazz.equals(Short.class))
return (T) stringToShort(s);
if (clazz.equals(Integer.class))
return (T) stringToInteger(s);
if (clazz.equals(Long.class))
return (T) stringToLong(s);
if (clazz.equals(Float.class))
return (T) stringToFloat(s);
if (clazz.equals(Double.class))
return (T) stringToDouble(s);
if (clazz.equals(String.class))
return (T) s;
return null;
}
@SuppressWarnings("unchecked")
public static <T> T toBasicType(Object o, Class<T> clazz) {
if (o == null) // check now to avoid comparison
return null;
Class<?> fromType = o.getClass();
// optimize for conversion to the same class
if (fromType.equals(clazz)) {
return BASIC_TYPES.contains(clazz) ? (T) o : null;
}
if (fromType.equals(Boolean.class))
return booleanToBasicType((Boolean) o, clazz);
if (fromType.equals(Byte.class))
return byteToBasicType((Byte) o, clazz);
if (fromType.equals(Character.class))
return charToBasicType((Character) o, clazz);
if (fromType.equals(Short.class))
return shortToBasicType((Short) o, clazz);
if (fromType.equals(Integer.class))
return intToBasicType((Integer) o, clazz);
if (fromType.equals(Long.class))
return longToBasicType((Long) o, clazz);
if (fromType.equals(Float.class))
return floatToBasicType((Float) o, clazz);
if (fromType.equals(Double.class))
return doubleToBasicType((Double) o, clazz);
if (fromType.equals(String.class))
return stringToBasicType((String) o, clazz);
return null;
}
public static final Object[] toBasicType(Object[] args, Class<?>[] types)
throws IllegalArgumentException {
if (args == null || types == null || args.length != types.length)
throw new IllegalArgumentException("Invalid arguments");
Object[] ret = new Object[args.length];
for (int i = 0; i < ret.length; ++i)
ret[i] = toBasicType(args[i], types[i]);
return ret;
}
// methods for class conversion
public static Class<?> toPrimitiveClass(Class<?> clazz) {
Class<?> c = WRAPPER_PRIMITIVE.get(clazz);
return c != null ? c : clazz;
}
public static Class<?> toPrimitiveClass(Class<?> clazz, Class<?> defaultClazz) {
Class<?> c = WRAPPER_PRIMITIVE.get(clazz);
return c != null ? c : defaultClazz;
}
public static Class<?> toPrimitiveWrapperClass(Class<?> clazz) {
Class<?> c = PRIMITIVE_WRAPPER.get(clazz);
return c != null ? c : clazz;
}
public static Class<?> toPrimitiveWrapperClass(Class<?> clazz, Class<?> defaultClazz) {
Class<?> c = PRIMITIVE_WRAPPER.get(clazz);
return c != null ? c : defaultClazz;
}
}