diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index c90aaa7d..ae97052e 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -677,15 +677,20 @@ public final class TypeAdapters { } } - public static final TypeAdapter.Factory ENUM_FACTORY = newEnumTypeHierarchyFactory(Enum.class); + public static final TypeAdapter.Factory ENUM_FACTORY = newEnumTypeHierarchyFactory(); - public static TypeAdapter.Factory newEnumTypeHierarchyFactory(final Class clazz) { + public static TypeAdapter.Factory newEnumTypeHierarchyFactory() { return new TypeAdapter.Factory() { @SuppressWarnings({"rawtypes", "unchecked"}) public TypeAdapter create(Gson gson, TypeToken typeToken) { Class rawType = typeToken.getRawType(); - return clazz.isAssignableFrom(rawType) - ? (TypeAdapter) new EnumTypeAdapter(rawType) : null; + if (!Enum.class.isAssignableFrom(rawType) || rawType == Enum.class) { + return null; + } + if (!rawType.isEnum()) { + rawType = rawType.getSuperclass(); // handle anonymous subclasses + } + return (TypeAdapter) new EnumTypeAdapter(rawType); } }; }