From 11b273241250c3103a6ec52b45f792328f50479c Mon Sep 17 00:00:00 2001 From: William Date: Tue, 30 Jan 2024 23:29:07 +0100 Subject: [PATCH] Fix $Gson$Types equals method for TypeVariable when its generic declaration is not a Class (#2599) * Fix $Gson$Types equals method for TypeVariable when its generic declaration is not a Class * Test $Gson$Types equals method with TypeVariable when its generic declaration is not a Class * Add @SuppressWarnings in GsonTypesTest.java --- .../com/google/gson/internal/$Gson$Types.java | 2 +- .../google/gson/internal/GsonTypesTest.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) 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 fc6b1a27d8..6ccdaa3eb5 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 @@ -217,7 +217,7 @@ public static boolean equals(Type a, Type b) { } TypeVariable va = (TypeVariable) a; TypeVariable vb = (TypeVariable) b; - return va.getGenericDeclaration() == vb.getGenericDeclaration() + return Objects.equals(va.getGenericDeclaration(), vb.getGenericDeclaration()) && va.getName().equals(vb.getName()); } else { 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 1e9d613e4a..8534e99195 100644 --- a/gson/src/test/java/com/google/gson/internal/GsonTypesTest.java +++ b/gson/src/test/java/com/google/gson/internal/GsonTypesTest.java @@ -19,6 +19,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; @@ -98,4 +100,37 @@ public static Type getFirstTypeArgument(Type type) throws Exception { } return $Gson$Types.canonicalize(actualTypeArguments[0]); } + + @Test + public void testEqualsOnMethodTypeVariables() throws Exception { + Method m1 = TypeVariableTest.class.getMethod("method"); + Method m2 = TypeVariableTest.class.getMethod("method"); + + Type rt1 = m1.getGenericReturnType(); + Type rt2 = m2.getGenericReturnType(); + + assertThat($Gson$Types.equals(rt1, rt2)).isTrue(); + } + + @Test + public void testEqualsOnConstructorParameterTypeVariables() throws Exception { + Constructor c1 = TypeVariableTest.class.getConstructor(Object.class); + Constructor c2 = TypeVariableTest.class.getConstructor(Object.class); + + Type rt1 = c1.getGenericParameterTypes()[0]; + Type rt2 = c2.getGenericParameterTypes()[0]; + + assertThat($Gson$Types.equals(rt1, rt2)).isTrue(); + } + + private static final class TypeVariableTest { + + @SuppressWarnings({"UnusedMethod", "UnusedVariable", "TypeParameterUnusedInFormals"}) + public TypeVariableTest(T parameter) {} + + @SuppressWarnings({"UnusedMethod", "UnusedVariable", "TypeParameterUnusedInFormals"}) + public T method() { + return null; + } + } }