diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java index 0cb9c10ef..40cbe0d8d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java @@ -121,6 +121,13 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { } throw new NoSuchKeyException(name); } + + private T getValue(String name, Class type) { + Object value = getValue(name); + checkInstance(name, value, type); + return (T) value; + } + private @Nullable Object getNullableValue(String name) { if (hasKey(name)) { return getLocalMap().get(name); @@ -128,13 +135,27 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { throw new NoSuchKeyException(name); } + private @Nullable T getNullableValue(String name, Class type) { + Object value = getNullableValue(name); + checkInstance(name, value, type); + return (T) value; + } + + private void checkInstance(String name, Object value, Class type) { + if (value != null && !type.isInstance(value)) { + throw new ClassCastException( + "Value for " + name + " cannot be cast from " + + value.getClass().getSimpleName() + " to " + type.getSimpleName()); + } + } + @Override public boolean getBoolean(String name) { if (mUseNativeAccessor) { mJniCallCounter++; return getBooleanNative(name); } - return ((Boolean) getValue(name)).booleanValue(); + return getValue(name, Boolean.class).booleanValue(); } private native boolean getBooleanNative(String name); @@ -144,7 +165,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { mJniCallCounter++; return getDoubleNative(name); } - return ((Double) getValue(name)).doubleValue(); + return getValue(name, Double.class).doubleValue(); } private native double getDoubleNative(String name); @@ -154,8 +175,9 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { mJniCallCounter++; return getIntNative(name); } + // All numbers coming out of native are doubles, so cast here then truncate - return ((Double) getValue(name)).intValue(); + return getValue(name, Double.class).intValue(); } private native int getIntNative(String name); @@ -165,7 +187,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { mJniCallCounter++; return getStringNative(name); } - return (String) getNullableValue(name); + return getNullableValue(name, String.class); } private native String getStringNative(String name); @@ -175,7 +197,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { mJniCallCounter++; return getArrayNative(name); } - return (ReadableArray) getNullableValue(name); + return getNullableValue(name, ReadableArray.class); } private native ReadableNativeArray getArrayNative(String name); @@ -185,7 +207,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { mJniCallCounter++; return getMapNative(name); } - return (ReadableNativeMap) getNullableValue(name); + return getNullableValue(name, ReadableNativeMap.class); } private native ReadableNativeMap getMapNative(String name);