Skip to content

Commit 51982bb

Browse files
committed
fix: two generated ParameterizedTypes aren't equals
Adds an equals method to the inner implementation of ParameterizedType.
1 parent ceb7a5b commit 51982bb

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

restx-common/src/main/java/restx/common/Types.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
import java.lang.reflect.Type;
1515
import java.lang.reflect.TypeVariable;
1616
import java.lang.reflect.WildcardType;
17+
import java.util.Arrays;
1718
import java.util.Map;
19+
import java.util.Objects;
1820

1921
/**
2022
* Date: 23/10/13
@@ -37,7 +39,25 @@ public Type getRawType() {
3739
public Type getOwnerType() {
3840
return rawType.getEnclosingClass();
3941
}
40-
};
42+
43+
@Override
44+
public int hashCode() {
45+
return Objects.hashCode(getOwnerType())
46+
^ Objects.hashCode(rawType)
47+
^ Arrays.hashCode(arguments);
48+
}
49+
50+
@Override
51+
public boolean equals(Object obj) {
52+
if (obj instanceof ParameterizedType) {
53+
ParameterizedType type = (ParameterizedType) obj;
54+
return Objects.equals(type.getOwnerType(), getOwnerType())
55+
&& Objects.equals(type.getRawType(), rawType)
56+
&& Arrays.equals(type.getActualTypeArguments(), arguments);
57+
}
58+
return false;
59+
}
60+
};
4161
}
4262

4363
/**

restx-common/src/test/java/restx/common/TypesTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.junit.Rule;
1010
import org.junit.Test;
1111

12+
import java.lang.reflect.Type;
1213
import java.util.AbstractList;
1314
import java.util.AbstractMap;
1415
import java.util.ArrayList;
@@ -24,6 +25,38 @@ public class TypesTest {
2425
@Rule
2526
public JUnitSoftAssertions softly = new JUnitSoftAssertions();
2627

28+
@Test
29+
public void newParameterizedType_should_create_equals_parameters_types() {
30+
Type parameterizedType1 = Types.newParameterizedType(List.class, String.class);
31+
Type parameterizedType2 = Types.newParameterizedType(List.class, String.class);
32+
softly.assertThat(parameterizedType1.equals(parameterizedType2)).isTrue();
33+
34+
Type typeReference = new TypeReference<List<String>>() {}.getType();
35+
softly.assertThat(typeReference.equals(parameterizedType1)).isTrue();
36+
}
37+
38+
static class GenericHolder<T> {
39+
final T value;
40+
41+
GenericHolder(T value) {
42+
this.value = value;
43+
}
44+
45+
public T getValue() {
46+
return value;
47+
}
48+
}
49+
50+
@Test
51+
public void newParameterizedType_should_create_equals_inner_parameters_types() {
52+
Type genericHolder1 = Types.newParameterizedType(GenericHolder.class, String.class);
53+
Type genericHolder2 = Types.newParameterizedType(GenericHolder.class, String.class);
54+
softly.assertThat(genericHolder1.equals(genericHolder2)).isTrue();
55+
56+
Type typeReference = new TypeReference<GenericHolder<String>>() {}.getType();
57+
softly.assertThat(typeReference.equals(genericHolder1)).isTrue();
58+
}
59+
2760
@Test
2861
public void getRawType_should_return_the_class_of_non_parametrized_types() {
2962
softly.assertThat(Types.getRawType(Integer.class)).isEqualTo(Integer.class);

0 commit comments

Comments
 (0)