1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockito.internal.util; 6 7 import java.util.HashMap; 8 import java.util.Map; 9 10 @SuppressWarnings("unchecked") 11 public class Primitives { 12 13 private static Map<Class<?>, Class<?>> primitiveTypes = new HashMap<Class<?>, Class<?>>(); 14 private static Map<Class<?>, Object> primitiveOrWrapperDefaultValues = new HashMap<Class<?>, Object>(); 15 16 17 /** 18 * Returns the primitive type of the given class. 19 * <p/> 20 * The passed class can be any class : <code>boolean.class</code>, <code>Integer.class</code> 21 * in witch case this method will return <code>boolean.class</code>, even <code>SomeObject.class</code> 22 * in which case <code>null</code> will be returned. 23 * 24 * @param clazz The class from which primitive type has to be retrieved 25 * @param <T> The type 26 * @return The primitive type if relevant, otherwise <code>null</code> 27 */ primitiveTypeOf(Class<T> clazz)28 public static <T> Class<T> primitiveTypeOf(Class<T> clazz) { 29 if (clazz.isPrimitive()) { 30 return clazz; 31 } 32 return (Class<T>) primitiveTypes.get(clazz); 33 } 34 35 /** 36 * Indicates if the given class is primitive type or a primitive wrapper. 37 * 38 * @param type The type to check 39 * @return <code>true</code> if primitive or wrapper, <code>false</code> otherwise. 40 */ isPrimitiveOrWrapper(Class<?> type)41 public static boolean isPrimitiveOrWrapper(Class<?> type) { 42 return primitiveOrWrapperDefaultValues.containsKey(type); 43 } 44 45 /** 46 * Returns the boxed default value for a primitive or a primitive wrapper. 47 * 48 * @param primitiveOrWrapperType The type to lookup the default value 49 * @return The boxed default values as defined in Java Language Specification, 50 * <code>null</code> if the type is neither a primitive nor a wrapper 51 */ defaultValueForPrimitiveOrWrapper(Class<T> primitiveOrWrapperType)52 public static <T> T defaultValueForPrimitiveOrWrapper(Class<T> primitiveOrWrapperType) { 53 return (T) primitiveOrWrapperDefaultValues.get(primitiveOrWrapperType); 54 } 55 56 57 static { primitiveTypes.put(Boolean.class, Boolean.TYPE)58 primitiveTypes.put(Boolean.class, Boolean.TYPE); primitiveTypes.put(Character.class, Character.TYPE)59 primitiveTypes.put(Character.class, Character.TYPE); primitiveTypes.put(Byte.class, Byte.TYPE)60 primitiveTypes.put(Byte.class, Byte.TYPE); primitiveTypes.put(Short.class, Short.TYPE)61 primitiveTypes.put(Short.class, Short.TYPE); primitiveTypes.put(Integer.class, Integer.TYPE)62 primitiveTypes.put(Integer.class, Integer.TYPE); primitiveTypes.put(Long.class, Long.TYPE)63 primitiveTypes.put(Long.class, Long.TYPE); primitiveTypes.put(Float.class, Float.TYPE)64 primitiveTypes.put(Float.class, Float.TYPE); primitiveTypes.put(Double.class, Double.TYPE)65 primitiveTypes.put(Double.class, Double.TYPE); 66 } 67 68 static { primitiveOrWrapperDefaultValues.put(Boolean.class, false)69 primitiveOrWrapperDefaultValues.put(Boolean.class, false); primitiveOrWrapperDefaultValues.put(Character.class, '\\u0000')70 primitiveOrWrapperDefaultValues.put(Character.class, '\u0000'); primitiveOrWrapperDefaultValues.put(Byte.class, (byte) 0)71 primitiveOrWrapperDefaultValues.put(Byte.class, (byte) 0); primitiveOrWrapperDefaultValues.put(Short.class, (short) 0)72 primitiveOrWrapperDefaultValues.put(Short.class, (short) 0); primitiveOrWrapperDefaultValues.put(Integer.class, 0)73 primitiveOrWrapperDefaultValues.put(Integer.class, 0); primitiveOrWrapperDefaultValues.put(Long.class, 0L)74 primitiveOrWrapperDefaultValues.put(Long.class, 0L); primitiveOrWrapperDefaultValues.put(Float.class, 0F)75 primitiveOrWrapperDefaultValues.put(Float.class, 0F); primitiveOrWrapperDefaultValues.put(Double.class, 0D)76 primitiveOrWrapperDefaultValues.put(Double.class, 0D); 77 primitiveOrWrapperDefaultValues.put(boolean.class, false)78 primitiveOrWrapperDefaultValues.put(boolean.class, false); primitiveOrWrapperDefaultValues.put(char.class, '\\u0000')79 primitiveOrWrapperDefaultValues.put(char.class, '\u0000'); primitiveOrWrapperDefaultValues.put(byte.class, (byte) 0)80 primitiveOrWrapperDefaultValues.put(byte.class, (byte) 0); primitiveOrWrapperDefaultValues.put(short.class, (short) 0)81 primitiveOrWrapperDefaultValues.put(short.class, (short) 0); primitiveOrWrapperDefaultValues.put(int.class, 0)82 primitiveOrWrapperDefaultValues.put(int.class, 0); primitiveOrWrapperDefaultValues.put(long.class, 0L)83 primitiveOrWrapperDefaultValues.put(long.class, 0L); primitiveOrWrapperDefaultValues.put(float.class, 0F)84 primitiveOrWrapperDefaultValues.put(float.class, 0F); primitiveOrWrapperDefaultValues.put(double.class, 0D)85 primitiveOrWrapperDefaultValues.put(double.class, 0D); 86 } 87 }