@@ -121,20 +121,41 @@ private Object getValue(String name) {
121121 }
122122 throw new NoSuchKeyException (name );
123123 }
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+
124131 private @ Nullable Object getNullableValue (String name ) {
125132 if (hasKey (name )) {
126133 return getLocalMap ().get (name );
127134 }
128135 throw new NoSuchKeyException (name );
129136 }
130137
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+
131152 @ Override
132153 public boolean getBoolean (String name ) {
133154 if (mUseNativeAccessor ) {
134155 mJniCallCounter ++;
135156 return getBooleanNative (name );
136157 }
137- return (( Boolean ) getValue (name ) ).booleanValue ();
158+ return getValue (name , Boolean . class ).booleanValue ();
138159 }
139160 private native boolean getBooleanNative (String name );
140161
@@ -144,7 +165,7 @@ public double getDouble(String name) {
144165 mJniCallCounter ++;
145166 return getDoubleNative (name );
146167 }
147- return (( Double ) getValue (name ) ).doubleValue ();
168+ return getValue (name , Double . class ).doubleValue ();
148169 }
149170 private native double getDoubleNative (String name );
150171
@@ -154,8 +175,9 @@ public int getInt(String name) {
154175 mJniCallCounter ++;
155176 return getIntNative (name );
156177 }
178+
157179 // 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 ();
159181 }
160182 private native int getIntNative (String name );
161183
@@ -165,7 +187,7 @@ public int getInt(String name) {
165187 mJniCallCounter ++;
166188 return getStringNative (name );
167189 }
168- return ( String ) getNullableValue (name );
190+ return getNullableValue (name , String . class );
169191 }
170192 private native String getStringNative (String name );
171193
@@ -175,7 +197,7 @@ public int getInt(String name) {
175197 mJniCallCounter ++;
176198 return getArrayNative (name );
177199 }
178- return ( ReadableArray ) getNullableValue (name );
200+ return getNullableValue (name , ReadableArray . class );
179201 }
180202 private native ReadableNativeArray getArrayNative (String name );
181203
@@ -185,7 +207,7 @@ public int getInt(String name) {
185207 mJniCallCounter ++;
186208 return getMapNative (name );
187209 }
188- return ( ReadableNativeMap ) getNullableValue (name );
210+ return getNullableValue (name , ReadableNativeMap . class );
189211 }
190212 private native ReadableNativeMap getMapNative (String name );
191213
0 commit comments