----- Mail original ----- > De: "Maurizio Cimadamore" <maurizio.cimadam...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "Chris Hegarty" <chris.hega...@oracle.com>, "amber-spec-experts" > <amber-spec-experts@openjdk.java.net>, "joe darcy" > <joe.da...@oracle.com> > Envoyé: Mercredi 4 Décembre 2019 01:26:11 > Objet: Re: Clarifying record reflective support
> On 04/12/2019 00:17, fo...@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)) { > ... > } I believe you mean something like 'matches' not 'instanceof'. > > 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. Calling an arbitrary methods inside an instanceof/switch is pure evil for me, i've been roughly bitten several times by implementations of the method unapply() in Scala doing side-effects and i see no point to introduce such shenanigans in Java. For 'matches', i suppose it should be based on Optional and/or null, being based on both is a kind of cool, like the enhanced for can be used on array or on Iterable, but is it enough to pass the bar to be included in Java ? If it works on something like an Optional, you may have to use filter: if (x matches Class.recordComponents(var components).filter(Class::isRecord)) { } > > Maurizio Rémi