diff --git a/gson/src/main/java/com/google/gson/internal/Primitives.java b/gson/src/main/java/com/google/gson/internal/Primitives.java index a98f6242..2506fd0a 100644 --- a/gson/src/main/java/com/google/gson/internal/Primitives.java +++ b/gson/src/main/java/com/google/gson/internal/Primitives.java @@ -16,11 +16,7 @@ package com.google.gson.internal; - import java.lang.reflect.Type; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; /** * Contains static utility methods pertaining to primitive types and their @@ -29,47 +25,13 @@ import java.util.Map; * @author Kevin Bourrillion */ public final class Primitives { - private Primitives() { - throw new UnsupportedOperationException(); - } - - /** A map from primitive types to their corresponding wrapper types. */ - private static final Map, Class> PRIMITIVE_TO_WRAPPER_TYPE; - - /** A map from wrapper types to their corresponding primitive types. */ - private static final Map, Class> WRAPPER_TO_PRIMITIVE_TYPE; - - // Sad that we can't use a BiMap. :( - - static { - Map, Class> primToWrap = new HashMap, Class>(16); - Map, Class> wrapToPrim = new HashMap, Class>(16); - - add(primToWrap, wrapToPrim, boolean.class, Boolean.class); - add(primToWrap, wrapToPrim, byte.class, Byte.class); - add(primToWrap, wrapToPrim, char.class, Character.class); - add(primToWrap, wrapToPrim, double.class, Double.class); - add(primToWrap, wrapToPrim, float.class, Float.class); - add(primToWrap, wrapToPrim, int.class, Integer.class); - add(primToWrap, wrapToPrim, long.class, Long.class); - add(primToWrap, wrapToPrim, short.class, Short.class); - add(primToWrap, wrapToPrim, void.class, Void.class); - - PRIMITIVE_TO_WRAPPER_TYPE = Collections.unmodifiableMap(primToWrap); - WRAPPER_TO_PRIMITIVE_TYPE = Collections.unmodifiableMap(wrapToPrim); - } - - private static void add(Map, Class> forward, - Map, Class> backward, Class key, Class value) { - forward.put(key, value); - backward.put(value, key); - } + private Primitives() {} /** * Returns true if this type is a primitive. */ public static boolean isPrimitive(Type type) { - return PRIMITIVE_TO_WRAPPER_TYPE.containsKey(type); + return type instanceof Class && ((Class) type).isPrimitive(); } /** @@ -79,8 +41,15 @@ public final class Primitives { * @see Class#isPrimitive */ public static boolean isWrapperType(Type type) { - return WRAPPER_TO_PRIMITIVE_TYPE.containsKey( - $Gson$Preconditions.checkNotNull(type)); + return type == Integer.class + || type == Float.class + || type == Byte.class + || type == Double.class + || type == Long.class + || type == Character.class + || type == Boolean.class + || type == Short.class + || type == Void.class; } /** @@ -92,12 +61,18 @@ public final class Primitives { * wrap(String.class) == String.class * */ + @SuppressWarnings("unchecked") public static Class wrap(Class type) { - // cast is safe: long.class and Long.class are both of type Class - @SuppressWarnings("unchecked") - Class wrapped = (Class) PRIMITIVE_TO_WRAPPER_TYPE.get( - $Gson$Preconditions.checkNotNull(type)); - return (wrapped == null) ? type : wrapped; + if (type == int.class) return (Class) Integer.class; + if (type == float.class) return (Class) Float.class; + if (type == byte.class) return (Class) Byte.class; + if (type == double.class) return (Class) Double.class; + if (type == long.class) return (Class) Long.class; + if (type == char.class) return (Class) Character.class; + if (type == boolean.class) return (Class) Boolean.class; + if (type == short.class) return (Class) Short.class; + if (type == void.class) return (Class) Void.class; + return type; } /** @@ -109,11 +84,17 @@ public final class Primitives { * unwrap(String.class) == String.class * */ + @SuppressWarnings("unchecked") public static Class unwrap(Class type) { - // cast is safe: long.class and Long.class are both of type Class - @SuppressWarnings("unchecked") - Class unwrapped = (Class) WRAPPER_TO_PRIMITIVE_TYPE.get( - $Gson$Preconditions.checkNotNull(type)); - return (unwrapped == null) ? type : unwrapped; + if (type == Integer.class) return (Class) int.class; + if (type == Float.class) return (Class) float.class; + if (type == Byte.class) return (Class) byte.class; + if (type == Double.class) return (Class) double.class; + if (type == Long.class) return (Class) long.class; + if (type == Character.class) return (Class) char.class; + if (type == Boolean.class) return (Class) boolean.class; + if (type == Short.class) return (Class) short.class; + if (type == Void.class) return (Class) void.class; + return type; } }