diff --git a/src/main/java/org/springframework/data/domain/Limit.java b/src/main/java/org/springframework/data/domain/Limit.java index b63d12d24..40286d0ca 100644 --- a/src/main/java/org/springframework/data/domain/Limit.java +++ b/src/main/java/org/springframework/data/domain/Limit.java @@ -17,7 +17,7 @@ package org.springframework.data.domain; import org.springframework.data.domain.Limit.Limited; import org.springframework.data.domain.Limit.Unlimited; -import org.springframework.util.ClassUtils; +import org.springframework.lang.Nullable; /** * {@link Limit} represents the maximum value up to which an operation should continue processing. It may be used for @@ -94,14 +94,17 @@ public sealed interface Limit permits Limited,Unlimited { if (obj == null) { return false; } - if (!ClassUtils.isAssignable(Limit.class, obj.getClass())) { + + if (!(obj instanceof Limit that)) { return false; } - Limit that = (Limit) obj; - if (this.isUnlimited() && that.isUnlimited()) { - return true; + + if (this.isUnlimited() ^ that.isUnlimited()) { + return false; } - return max() == that.max(); + + return this.isUnlimited() && that.isUnlimited() + || max() == that.max(); } @Override diff --git a/src/test/java/org/springframework/data/domain/LimitUnitTests.java b/src/test/java/org/springframework/data/domain/LimitUnitTests.java index c1e8f1f54..3741e1888 100644 --- a/src/test/java/org/springframework/data/domain/LimitUnitTests.java +++ b/src/test/java/org/springframework/data/domain/LimitUnitTests.java @@ -55,4 +55,15 @@ class LimitUnitTests { void unlimitedErrorsOnMax() { assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> Limit.unlimited().max()); } + + @Test // GH-3023 + void equalsProperly() { + + Limit unlimited = Limit.unlimited(); + Limit limited = Limit.of(5); + + assertThat(limited.equals(unlimited)).isFalse(); + assertThat(unlimited.equals(limited)).isFalse(); + assertThat(unlimited.equals(unlimited)).isTrue(); + } }