diff --git a/gson/src/main/java/com/google/gson/internal/$Gson$Types.java b/gson/src/main/java/com/google/gson/internal/$Gson$Types.java index f1d22f4608..8a65031d1a 100644 --- a/gson/src/main/java/com/google/gson/internal/$Gson$Types.java +++ b/gson/src/main/java/com/google/gson/internal/$Gson$Types.java @@ -328,8 +328,8 @@ public static Type[] getMapKeyAndValueTypes(Type context, Class contextRawTyp * class should extend Hashtable, but it's declared to * extend Hashtable. */ - if (context == Properties.class) { - return new Type[] {String.class, String.class}; // TODO: test subclasses of Properties! + if (Properties.class.isAssignableFrom(contextRawType)) { + return new Type[] {String.class, String.class}; } Type mapType = getSupertype(context, contextRawType, Map.class); diff --git a/gson/src/test/java/com/google/gson/internal/GsonTypesTest.java b/gson/src/test/java/com/google/gson/internal/GsonTypesTest.java index a877581bb9..facfd62731 100644 --- a/gson/src/test/java/com/google/gson/internal/GsonTypesTest.java +++ b/gson/src/test/java/com/google/gson/internal/GsonTypesTest.java @@ -24,6 +24,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; +import java.util.Properties; import org.junit.Test; @SuppressWarnings("ClassNamedLikeTypeParameter") // for dummy classes A, B, ... @@ -133,4 +134,17 @@ public T method() { return null; } } + + @Test + public void testGetMapKeyAndValueTypesForPropertiesSubclass() throws Exception { + class CustomProperties extends Properties { + private static final long serialVersionUID = 4112578634029874840L; + } + + Type[] types = + $Gson$Types.getMapKeyAndValueTypes(CustomProperties.class, CustomProperties.class); + + assertThat(types[0]).isEqualTo(String.class); + assertThat(types[1]).isEqualTo(String.class); + } }