On Thu, 21 Dec 2023 18:30:40 GMT, Rob Spoor <[email protected]> wrote:

>> Sergey Tsypanov has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   Update src/java.base/share/classes/java/lang/runtime/ObjectMethods.java
>>   
>>   Co-authored-by: ExE Boss <[email protected]>
>
> src/java.base/share/classes/java/lang/runtime/ObjectMethods.java line 224:
> 
>> 222:             var rt2 = mh2.type().returnType();
>> 223:             return Integer.compare(
>> 224:                 rt1.isPrimitive() || rt1.isEnum() || rt1.isArray() ? 1 
>> : Iterable.class.isAssignableFrom(rt1) ? -1 : 0,
> 
> Doesn't this put primitives, enums and arrays at the end instead of at the 
> start? I've tried this with a simple array:
> 
> Class<?>[] types = { int.class, String.class, List.class, long.class, 
> TimeUnit.class, byte[].class, Integer.class };
> 
> The result of sorting:
> 
>  Class[7] { interface java.util.List, class java.lang.String, class 
> java.lang.Integer, int, long, class java.util.concurrent.TimeUnit, class [B }
> 
> By switching the -1 and 1 I get the primitives etc.  at the start:
> 
>  Class[7] { int, long, class java.util.concurrent.TimeUnit, class [B, class 
> java.lang.String, class java.lang.Integer, interface java.util.List }
> ``

The `equalator`s are joined together in reverse order, so this is actually 
correct for the current implementation:


record Example(A a, B b, C c) {
        public static void main(String... args) {
                final var left  = new Example(new A(), new B(), new C());
                final var right = new Example(new A(), new B(), new C());

                left.equals(right);
                // prints:
                // > C::equals()
                // > B::equals()
                // > A::equals()
        }
}

record A() {
        @Override
        public boolean equals(Object other) {
                System.out.println("A::equals()");
                return other instanceof A;
        }
}

record B() {
        @Override
        public boolean equals(Object other) {
                System.out.println("B::equals()");
                return other instanceof B;
        }
}

record C() {
        @Override
        public boolean equals(Object other) {
                System.out.println("C::equals()");
                return other instanceof C;
        }
}

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/17143#discussion_r1434439484

Reply via email to