Sorry Remi, my original email was a little cryptic! What Brian writes is what I propose to spec, and what I was asking for opinions on. I log your approval :-)
Gavin > On 20 Sep 2019, at 15:21, fo...@univ-mlv.fr wrote: > > > > De: "Brian Goetz" <brian.go...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "Gavin Bierman" <gavin.bier...@oracle.com>, "amber-spec-experts" > <amber-spec-experts@openjdk.java.net> > Envoyé: Vendredi 20 Septembre 2019 16:12:48 > Objet: Re: Draft JLS spec for JEP 305: Pattern matching for instanceof > 1. The instanceof operator restricts the type to be a reifiable reference > type. The spec currently keeps that restriction for type test patterns too. > But should we go further, i.e. will people expect to be able to say the > following (given that this *declares* a pattern variable l)? > > if (o instanceof List<Integer> l) { > … > } > > If we allow such case, the compiler will have to emit an unchecked warning > because this code is not safe. > > This is not correct. If you look at what I wrote in > > http://cr.openjdk.java.net/~briangoetz/amber/pattern-semantics.html > <http://cr.openjdk.java.net/~briangoetz/amber/pattern-semantics.html> > > it is possible to do this in a safe manner, by appealing to whether the cast > conversion is checked or not: > > Generic type patterns are permitted (this is a relaxation of the current > semantics of the instanceof operator, which requires that the type operand is > reifiable.) However, when determining applicability involves cast > conversions, the pattern is not applicable if the cast conversion would be > unchecked. So it is allowable to say > > List<Integer> list = ... > if (list instanceof ArrayList<Integer> a) { ... } > but not > > List<?> list = ... > if (list instanceof ArrayList<String> a) { ... } > > So if we permitted non-reifiable types in type patterns, it would only be > where a cast conversion would not produced an unchecked warning, and this is > not unsafe. > > yes, you're right. > need to get some coffee ... > > so i'm ok with that construct. > > Rémi >