From a210d89a554a8f9bdd4961162c47ab53bdde52e5 Mon Sep 17 00:00:00 2001 From: Eric Cochran Date: Sun, 7 Jan 2018 11:05:49 -0800 Subject: [PATCH] Don't handle WildcardTypes in ClassJsonAdapter. (#406) --- .../com/squareup/moshi/ClassJsonAdapter.java | 5 +++-- .../java/com/squareup/moshi/MoshiTest.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java index 833238e..087a428 100644 --- a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java +++ b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java @@ -45,7 +45,8 @@ final class ClassJsonAdapter extends JsonAdapter { public static final JsonAdapter.Factory FACTORY = new JsonAdapter.Factory() { @Override public @Nullable JsonAdapter create( Type type, Set annotations, Moshi moshi) { - Class rawType = Types.getRawType(type); + if (!(type instanceof Class)) return null; + Class rawType = (Class) type; if (rawType.isInterface() || rawType.isEnum()) return null; if (isPlatformType(rawType) && !Types.isAllowedPlatformType(rawType)) { throw new IllegalArgumentException("Platform " @@ -71,7 +72,7 @@ final class ClassJsonAdapter extends JsonAdapter { ClassFactory classFactory = ClassFactory.get(rawType); Map> fields = new TreeMap<>(); - for (Type t = type; t != Object.class; t = Types.getGenericSuperclass(t)) { + for (Type t = rawType; t != Object.class; t = Types.getGenericSuperclass(t)) { createFieldBindings(moshi, t, fields); } return new ClassJsonAdapter<>(classFactory, fields).nullSafe(); diff --git a/moshi/src/test/java/com/squareup/moshi/MoshiTest.java b/moshi/src/test/java/com/squareup/moshi/MoshiTest.java index 97909a5..66a1428 100644 --- a/moshi/src/test/java/com/squareup/moshi/MoshiTest.java +++ b/moshi/src/test/java/com/squareup/moshi/MoshiTest.java @@ -534,6 +534,26 @@ public final class MoshiTest { assertThat(adapter.toJson(null)).isEqualTo("null"); } + @Test public void upperBoundedWildcardsAreNotHandled() { + Moshi moshi = new Moshi.Builder().build(); + try { + moshi.adapter(Types.subtypeOf(String.class)); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage("No JsonAdapter for ? extends java.lang.String annotated []"); + } + } + + @Test public void lowerBoundedWildcardsAreNotHandled() { + Moshi moshi = new Moshi.Builder().build(); + try { + moshi.adapter(Types.supertypeOf(String.class)); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage("No JsonAdapter for ? super java.lang.String annotated []"); + } + } + @Test public void addNullFails() throws Exception { Type type = Object.class; Class annotation = Annotation.class;