Clarifying record reflective support

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Dec 4 00:26:11 UTC 2019


On 04/12/2019 00:17, forax at univ-mlv.fr wrote:
> I don't follow you, conceptually a pattern matching is an optional of 
> tuples (i don't want to go more deep than that given that the real 
> implementation is still in flux), you can construct an optional if 
> getReturnComponents() returns null or not.

Right - but what happens when you do:

Class<?> x = ...
if (x instanceof Class.recordComponents(var components)) {
    ...
}

If the method Class::getRecordComponents always returns something (e.g. 
an empty array) and we claim that a deconstructor here is the dual case 
of that, that might suggest that the pattern above always matches (in 
some cases with 'components' bound to an empty array). My guts is that 
people writing the above code will want it NOT to match if 'x' is not a 
record class; but if you go there, then you have what seems like an 
asymmetry: I can ask String.class.getRecordComponents (and get an empty 
array) but I can pattern-match String.class, because the extractor also 
does the 'isRecord' trick, and fail to match if that returns false.

Not saying it's not doable... but feels more awkward for some reason.

Maurizio



More information about the amber-spec-experts mailing list