From 739efea61d715fe308e5da7c5a800b215f7ec0d6 Mon Sep 17 00:00:00 2001 From: Tomas Kotula Date: Fri, 22 Apr 2016 11:07:41 +0200 Subject: [PATCH] Workaround for Android ParameterizedType implementation bug --- .../squareup/moshi/AdapterMethodsFactory.java | 2 +- .../squareup/moshi/AdapterMethodsTest.java | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/moshi/src/main/java/com/squareup/moshi/AdapterMethodsFactory.java b/moshi/src/main/java/com/squareup/moshi/AdapterMethodsFactory.java index 2025922..3f75ad5 100644 --- a/moshi/src/main/java/com/squareup/moshi/AdapterMethodsFactory.java +++ b/moshi/src/main/java/com/squareup/moshi/AdapterMethodsFactory.java @@ -228,7 +228,7 @@ final class AdapterMethodsFactory implements JsonAdapter.Factory { List adapterMethods, Type type, Set annotations) { for (int i = 0, size = adapterMethods.size(); i < size; i++) { AdapterMethod adapterMethod = adapterMethods.get(i); - if (adapterMethod.type.equals(type) && adapterMethod.annotations.equals(annotations)) { + if (Types.equals(adapterMethod.type, type) && adapterMethod.annotations.equals(annotations)) { return adapterMethod; } } diff --git a/moshi/src/test/java/com/squareup/moshi/AdapterMethodsTest.java b/moshi/src/test/java/com/squareup/moshi/AdapterMethodsTest.java index 6d3c87c..1271c27 100644 --- a/moshi/src/test/java/com/squareup/moshi/AdapterMethodsTest.java +++ b/moshi/src/test/java/com/squareup/moshi/AdapterMethodsTest.java @@ -18,6 +18,8 @@ package com.squareup.moshi; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -357,6 +359,50 @@ public final class AdapterMethodsTest { } } + /** + * Unfortunately in some versions of Android the implementations of {@link ParameterizedType} + * doesn't implement equals and hashCode. Confirm that we work around that. + */ + @Test public void parameterizedTypeEqualsNotUsed() throws Exception { + Moshi moshi = new Moshi.Builder() + .add(new ListOfStringJsonAdapter()) + .build(); + + // This class doesn't implement equals() and hashCode() as it should. + ParameterizedType listOfStringType = new ParameterizedType() { + @Override public Type[] getActualTypeArguments() { + return new Type[] { String.class }; + } + + @Override public Type getRawType() { + return List.class; + } + + @Override public Type getOwnerType() { + return null; + } + }; + + JsonAdapter> jsonAdapter = moshi.adapter(listOfStringType); + assertThat(jsonAdapter.toJson(Arrays.asList("a", "b", "c"))).isEqualTo("\"a|b|c\""); + assertThat(jsonAdapter.fromJson("\"a|b|c\"")).isEqualTo(Arrays.asList("a", "b", "c")); + } + + static class ListOfStringJsonAdapter { + @ToJson String listOfStringToJson(List list) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < list.size(); i++) { + if (i > 0) result.append('|'); + result.append(list.get(i)); + } + return result.toString(); + } + + @FromJson List listOfStringFromJson(String string) { + return Arrays.asList(string.split("\\|")); + } + } + static class Point { final int x; final int y;