Thanks Tagir, this is a helpful exploration.  There are lots of places in the JDK (and the world beyond) that assume "eight primitive types, no more"; finding them is a game of whack-a-mole.  The real question is how many of them would fall back to something reasonable when the ninth primitive shows up, vs how many would blow up.

THe good news is that, because primitives extend Object, code that says "do X for primitives, otherwise fall back to Object::hashCode (or ::toString or whatever) is likely to usually work.

A synthetic "array" supertype is something we've discussed a few times, but always got distracted before coming to any conclusions.

final int elementHash = switch(element) {
   case null -> 0;
   case AnyArray anyArray -> switch(anyArray) {
     case Object[] arr -> deepHashCode(arr);
     case byte[] arr   -> hashCode(arr);
     case short[] arr  -> hashCode(arr);
     case char[] arr   -> hashCode(arr);
     case int[] arr    -> hashCode(arr);
     case long[] arr   -> hashCode(arr);
     case float[] arr  -> hashCode(arr);
     case double[] arr -> hashCode(arr);
     // no default case!
   };
   default -> element.hashCode();
};

You would need to reorder this switch!  Because byte[] will be a subtype of Object[].


Reply via email to