16
16
17
17
package com .google .gson .internal ;
18
18
19
- import com .google .gson .InstanceCreator ;
20
- import com .google .gson .JsonIOException ;
21
- import com .google .gson .reflect .TypeToken ;
22
-
23
19
import java .lang .reflect .Constructor ;
24
20
import java .lang .reflect .InvocationTargetException ;
25
21
import java .lang .reflect .ParameterizedType ;
37
33
import java .util .SortedSet ;
38
34
import java .util .TreeMap ;
39
35
import java .util .TreeSet ;
36
+ import java .util .concurrent .ConcurrentHashMap ;
37
+ import java .util .concurrent .ConcurrentMap ;
38
+ import java .util .concurrent .ConcurrentNavigableMap ;
39
+ import java .util .concurrent .ConcurrentSkipListMap ;
40
+
41
+ import com .google .gson .InstanceCreator ;
42
+ import com .google .gson .JsonIOException ;
43
+ import com .google .gson .reflect .TypeToken ;
40
44
41
45
/**
42
46
* Returns a function that can construct an instance of a requested type.
@@ -58,7 +62,7 @@ public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
58
62
final InstanceCreator <T > typeCreator = (InstanceCreator <T >) instanceCreators .get (type );
59
63
if (typeCreator != null ) {
60
64
return new ObjectConstructor <T >() {
61
- public T construct () {
65
+ @ Override public T construct () {
62
66
return typeCreator .createInstance (type );
63
67
}
64
68
};
@@ -70,7 +74,7 @@ public T construct() {
70
74
(InstanceCreator <T >) instanceCreators .get (rawType );
71
75
if (rawTypeCreator != null ) {
72
76
return new ObjectConstructor <T >() {
73
- public T construct () {
77
+ @ Override public T construct () {
74
78
return rawTypeCreator .createInstance (type );
75
79
}
76
80
};
@@ -98,7 +102,7 @@ private <T> ObjectConstructor<T> newDefaultConstructor(Class<? super T> rawType)
98
102
}
99
103
return new ObjectConstructor <T >() {
100
104
@ SuppressWarnings ("unchecked" ) // T is the same raw type as is requested
101
- public T construct () {
105
+ @ Override public T construct () {
102
106
try {
103
107
Object [] args = null ;
104
108
return (T ) constructor .newInstance (args );
@@ -130,14 +134,14 @@ private <T> ObjectConstructor<T> newDefaultImplementationConstructor(
130
134
if (Collection .class .isAssignableFrom (rawType )) {
131
135
if (SortedSet .class .isAssignableFrom (rawType )) {
132
136
return new ObjectConstructor <T >() {
133
- public T construct () {
137
+ @ Override public T construct () {
134
138
return (T ) new TreeSet <Object >();
135
139
}
136
140
};
137
141
} else if (EnumSet .class .isAssignableFrom (rawType )) {
138
142
return new ObjectConstructor <T >() {
139
143
@ SuppressWarnings ("rawtypes" )
140
- public T construct () {
144
+ @ Override public T construct () {
141
145
if (type instanceof ParameterizedType ) {
142
146
Type elementType = ((ParameterizedType ) type ).getActualTypeArguments ()[0 ];
143
147
if (elementType instanceof Class ) {
@@ -152,42 +156,54 @@ public T construct() {
152
156
};
153
157
} else if (Set .class .isAssignableFrom (rawType )) {
154
158
return new ObjectConstructor <T >() {
155
- public T construct () {
159
+ @ Override public T construct () {
156
160
return (T ) new LinkedHashSet <Object >();
157
161
}
158
162
};
159
163
} else if (Queue .class .isAssignableFrom (rawType )) {
160
164
return new ObjectConstructor <T >() {
161
- public T construct () {
165
+ @ Override public T construct () {
162
166
return (T ) new LinkedList <Object >();
163
167
}
164
168
};
165
169
} else {
166
170
return new ObjectConstructor <T >() {
167
- public T construct () {
171
+ @ Override public T construct () {
168
172
return (T ) new ArrayList <Object >();
169
173
}
170
174
};
171
175
}
172
176
}
173
177
174
178
if (Map .class .isAssignableFrom (rawType )) {
175
- if (SortedMap .class .isAssignableFrom (rawType )) {
179
+ if (ConcurrentNavigableMap .class .isAssignableFrom (rawType )) {
180
+ return new ObjectConstructor <T >() {
181
+ @ Override public T construct () {
182
+ return (T ) new ConcurrentSkipListMap <Object , Object >();
183
+ }
184
+ };
185
+ } else if (ConcurrentMap .class .isAssignableFrom (rawType )) {
186
+ return new ObjectConstructor <T >() {
187
+ @ Override public T construct () {
188
+ return (T ) new ConcurrentHashMap <Object , Object >();
189
+ }
190
+ };
191
+ } else if (SortedMap .class .isAssignableFrom (rawType )) {
176
192
return new ObjectConstructor <T >() {
177
- public T construct () {
193
+ @ Override public T construct () {
178
194
return (T ) new TreeMap <Object , Object >();
179
195
}
180
196
};
181
197
} else if (type instanceof ParameterizedType && !(String .class .isAssignableFrom (
182
198
TypeToken .get (((ParameterizedType ) type ).getActualTypeArguments ()[0 ]).getRawType ()))) {
183
199
return new ObjectConstructor <T >() {
184
- public T construct () {
200
+ @ Override public T construct () {
185
201
return (T ) new LinkedHashMap <Object , Object >();
186
202
}
187
203
};
188
204
} else {
189
205
return new ObjectConstructor <T >() {
190
- public T construct () {
206
+ @ Override public T construct () {
191
207
return (T ) new LinkedTreeMap <String , Object >();
192
208
}
193
209
};
@@ -202,7 +218,7 @@ private <T> ObjectConstructor<T> newUnsafeAllocator(
202
218
return new ObjectConstructor <T >() {
203
219
private final UnsafeAllocator unsafeAllocator = UnsafeAllocator .create ();
204
220
@ SuppressWarnings ("unchecked" )
205
- public T construct () {
221
+ @ Override public T construct () {
206
222
try {
207
223
Object newInstance = unsafeAllocator .newInstance (rawType );
208
224
return (T ) newInstance ;
0 commit comments