• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }