@@ -121,20 +121,41 @@ private Object getValue(String name) {
121
121
}
122
122
throw new NoSuchKeyException (name );
123
123
}
124
+
125
+ private <T > T getValue (String name , Class <T > type ) {
126
+ Object value = getValue (name );
127
+ checkInstance (name , value , type );
128
+ return (T ) value ;
129
+ }
130
+
124
131
private @ Nullable Object getNullableValue (String name ) {
125
132
if (hasKey (name )) {
126
133
return getLocalMap ().get (name );
127
134
}
128
135
throw new NoSuchKeyException (name );
129
136
}
130
137
138
+ private @ Nullable <T > T getNullableValue (String name , Class <T > type ) {
139
+ Object value = getNullableValue (name );
140
+ checkInstance (name , value , type );
141
+ return (T ) value ;
142
+ }
143
+
144
+ private void checkInstance (String name , Object value , Class type ) {
145
+ if (value != null && !type .isInstance (value )) {
146
+ throw new ClassCastException (
147
+ "Value for " + name + " cannot be cast from " +
148
+ value .getClass ().getSimpleName () + " to " + type .getSimpleName ());
149
+ }
150
+ }
151
+
131
152
@ Override
132
153
public boolean getBoolean (String name ) {
133
154
if (mUseNativeAccessor ) {
134
155
mJniCallCounter ++;
135
156
return getBooleanNative (name );
136
157
}
137
- return (( Boolean ) getValue (name ) ).booleanValue ();
158
+ return getValue (name , Boolean . class ).booleanValue ();
138
159
}
139
160
private native boolean getBooleanNative (String name );
140
161
@@ -144,7 +165,7 @@ public double getDouble(String name) {
144
165
mJniCallCounter ++;
145
166
return getDoubleNative (name );
146
167
}
147
- return (( Double ) getValue (name ) ).doubleValue ();
168
+ return getValue (name , Double . class ).doubleValue ();
148
169
}
149
170
private native double getDoubleNative (String name );
150
171
@@ -154,8 +175,9 @@ public int getInt(String name) {
154
175
mJniCallCounter ++;
155
176
return getIntNative (name );
156
177
}
178
+
157
179
// All numbers coming out of native are doubles, so cast here then truncate
158
- return (( Double ) getValue (name ) ).intValue ();
180
+ return getValue (name , Double . class ).intValue ();
159
181
}
160
182
private native int getIntNative (String name );
161
183
@@ -165,7 +187,7 @@ public int getInt(String name) {
165
187
mJniCallCounter ++;
166
188
return getStringNative (name );
167
189
}
168
- return ( String ) getNullableValue (name );
190
+ return getNullableValue (name , String . class );
169
191
}
170
192
private native String getStringNative (String name );
171
193
@@ -175,7 +197,7 @@ public int getInt(String name) {
175
197
mJniCallCounter ++;
176
198
return getArrayNative (name );
177
199
}
178
- return ( ReadableArray ) getNullableValue (name );
200
+ return getNullableValue (name , ReadableArray . class );
179
201
}
180
202
private native ReadableNativeArray getArrayNative (String name );
181
203
@@ -185,7 +207,7 @@ public int getInt(String name) {
185
207
mJniCallCounter ++;
186
208
return getMapNative (name );
187
209
}
188
- return ( ReadableNativeMap ) getNullableValue (name );
210
+ return getNullableValue (name , ReadableNativeMap . class );
189
211
}
190
212
private native ReadableNativeMap getMapNative (String name );
191
213
0 commit comments