diff --git a/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java b/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java index 1088d8b..be7e7fc 100644 --- a/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java +++ b/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java @@ -154,8 +154,8 @@ public final class PolymorphicJsonAdapterFactory implements JsonAdapter.Facto public PolymorphicJsonAdapterFactory withSubtype(Class subtype, String label) { if (subtype == null) throw new NullPointerException("subtype == null"); if (label == null) throw new NullPointerException("label == null"); - if (labels.contains(label) || subtypes.contains(subtype)) { - throw new IllegalArgumentException("Subtypes and labels must be unique."); + if (labels.contains(label)) { + throw new IllegalArgumentException("Labels must be unique."); } List newLabels = new ArrayList<>(labels); newLabels.add(label); diff --git a/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java b/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java index cf66e5c..f0c0d0a 100644 --- a/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java +++ b/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java @@ -160,16 +160,22 @@ public final class PolymorphicJsonAdapterFactoryTest { assertThat(reader.peek()).isEqualTo(JsonReader.Token.END_DOCUMENT); } - @Test public void uniqueSubtypes() { - PolymorphicJsonAdapterFactory factory = - PolymorphicJsonAdapterFactory.of(Message.class, "type") - .withSubtype(Success.class, "success"); - try { - factory.withSubtype(Success.class, "data"); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("Subtypes and labels must be unique."); - } + @Test public void nonUniqueSubtypes() throws IOException { + Moshi moshi = new Moshi.Builder() + .add(PolymorphicJsonAdapterFactory.of(Message.class, "type") + .withSubtype(Success.class, "success") + .withSubtype(Success.class, "data") + .withSubtype(Error.class, "error")) + .build(); + + JsonAdapter adapter = moshi.adapter(Message.class); + + assertThat(adapter.fromJson("{\"type\":\"success\",\"value\":\"Okay!\"}")) + .isEqualTo(new Success("Okay!")); + assertThat(adapter.fromJson("{\"type\":\"data\",\"value\":\"Data!\"}")) + .isEqualTo(new Success("Data!")); + assertThat(adapter.fromJson("{\"type\":\"error\",\"error_logs\":{\"order\":66}}")) + .isEqualTo(new Error(Collections.singletonMap("order", 66d))); } @Test public void uniqueLabels() { @@ -180,7 +186,7 @@ public final class PolymorphicJsonAdapterFactoryTest { factory.withSubtype(Error.class, "data"); fail(); } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("Subtypes and labels must be unique."); + assertThat(expected).hasMessage("Labels must be unique."); } }